【问题标题】:What is the simplest way of finding the distance between two pixels?找到两个像素之间距离的最简单方法是什么?
【发布时间】:2015-10-12 14:38:14
【问题描述】:

这可能是一个有点愚蠢的问题 - 但假设我想找到两个像素之间的距离,坐标为 (x1,y1) 和 (x2,y2 )。使用 MatLab 执行此操作的最简单方法是什么?

【问题讨论】:

  • 你好。我看到您最近得到了很多帮助,但我们没有收到您关于我们的回答帮助您的反馈。如果我们帮助了您,也许如果您接受我们的一些答案,它会告诉我们您不再需要任何帮助。

标签: matlab image-processing


【解决方案1】:

pdist 是一个不错的答案,但我认为它很慢(至少对于更多的点而言)。此外,pdist 需要统计工具箱,因此如果您没有该工具箱,则无法使用该答案。

我建议将bsxfunpermutereshape 结合使用,而不是独立于工具箱的解决方案。假设X是一个2列矩阵,排列方式如下:

X = [x y];

xy 是您要查找距离的所有点的 X 和 Y 坐标。因此,每一行都包含一个查询点:

X2 = permute(X, [3 2 1]);
out = sqrt(sum(bsxfun(@minus, X, X2).^2, 2));
out = reshape(out, size(X,1), []);

这应该会给您与将squareform 应用于pdist 的输出相同的输出。具体来说,在out 的元素(i,j) 处,这将为您提供点i 和点j 之间的距离,因此对角线元素应给出0 的值,因为自距离为0。

乔纳斯的建议

如果我们在计算距离之前稍微改变permute 尺寸的方式,我们可以通过将其替换为另一个permute 调用来避免reshape,这可能代价高昂:

out = sqrt(sum(bsxfun(@minus, permute(X, [1 3 2]), permute(X, [3 1 2])).^2, 3));

【讨论】:

  • 或者,有两个置换并且没有重塑:out = sqrt(sum(bsxfun(@minus, permute(X, [1 3 2]), permute(X, 3 1 2)).^2, 3)
【解决方案2】:
X = [x1,y1;x2,y2];
d = pdist(X,'euclidean')

d 是距离。

【讨论】:

  • 那么循环遍历所有像素并应用这段代码?
  • @Zetland - 不。只需将所有点放入N x 2 矩阵中,其中N 是您的总点数,然后将其设为X。之后,使用pdist。顺便说一句,我建议在此代码上使用squareform,以便将其转换为更易读的格式。
猜你喜欢
  • 2013-02-07
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多