4

我有一个带有直线的图像。我想使用频域检查线条是否平行。我在图像上做fft,我得到了变换图像。

有谁知道我如何使用变换图像来查找线是否平行?

4

3 回答 3

5

所以这里有两种情况,使用一些随机角度或相同角度,2条可变长度的线,以及它们的绝对值ffts。 样品图片

因此,有很多方法可以通过查看它们的 fft 来判断它们是否平行,我将在一个更简单的方向上给出提示,从 fft'ed 图像的中心开始......

于 2013-01-13T06:20:13.923 回答
4

如果您只有 2 行,那么 FFT 是个坏主意。它缓慢而复杂。

最简单的实现是平滑图像。计算梯度角度(atan2(gradY,gradX)),而不仅仅是将它们放在直方图中。如果您有一个清晰的峰 - 线是平行的。否则他们不是。从直方图中您还可以知道每条线的角度(局部最大值代表一条线)。

最快的运行时间是使用连接组件样式。

  1. 循环搜索黑色图像,直到找到白色像素。这是一行的开头
  2. 递归遍历像素邻居,直到找到最远的像素。这是行的结尾
  3. 当您知道起点和终点时,您可以通过 计算每条线的斜率atan2(endY-startY,endX-startX)。现在你分析地比较这些线。如果它们的斜率差异大于 0.1 弧度(5 度),则线不被视为平行。此解决方案适用于任意数量的线条,它还给出了每条线条的所有像素列表 + 线条的数学方程为 AX+BY+C = 0。

如果你还坚持FFT我建议旋转原始图像或 FFT 图像,以便至少有一条线平行于 Y 轴(FFT 的表示在 X 轴上)。比检查第二条线是否平行更容易。如果它们平行,则它们都与 y 轴对齐,并且意味着整个 FFT 变换位于 X 轴上。只需检查几个中心行上方的 FFT 的所有像素是否为零。如果不是,则表示线不平行,因为第一条线位于 FFT 图像的 X 轴上,第二条线上下移动。Ps 我没有解释如何旋转图像,所以至少有一条线与 Y 轴对齐。如果您在原始图像上执行此操作,只需计算梯度的方向(角度),找到最大值并将图像旋转(减去最大值,以度为单位)。在 FFT 图像上,您可以执行相同的操作,

重要提示:您的问题从其他人那里得到了许多不准确的答案。这里有一些更正

  1. 不要使用 Hough 或 Radon 变换!它相对较慢,对于您只有 2 行的简单任务来说完全是多余的。
  2. 当您使用 FFT 时,您实际上可以知道线条的位置。到目前为止,我们使用 FFT 的幅度图像,但也有相位图像,并且线的位置被编码在相位图像中。

最后:我建议您实施我表示为最快运行时间的解决方案。如果图像有 N 个像素,您将平均O(N)步数,而只有 FFT 至少需要O(N*log(N))步数。

于 2013-01-13T13:40:25.023 回答
1

如果您对确定许多等距平行线的周期性感兴趣,则可以使用 FFT。在这种情况下,FFT 变换的图像应该为您提供特定频率的峰值。通过阈值处理,您还可以消除图像中的这些线条。但是,您实际上不会找到图像中线条的位置。

为了找到平行线,您可以使用其他技术,例如:

于 2013-01-12T15:57:42.427 回答