使用频域检测图像中的平行线

时间:2013-01-12 15:43:25

标签: matlab image-processing

我有一条直线图像。 我想检查线路是否是使用频域的并行。 我正在对图像进行fft,然后得到变换图像。

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

3 个答案:

答案 0 :(得分:5)

所以这里有两种情况,使用一些随机角度或相同的角度,2行可变长度,以及它们的绝对值ffts。 sample img

所以有很多方法可以通过观察他们的fft来判断它们是否平行,我会在一个更简单的方向上给出一个提示,从fft'ed图像的中心开始... < / p>

答案 1 :(得分:4)

如果你只有2行而不是FFT是一个坏主意。这是缓慢而复杂的。

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

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

  1. 在循环中搜索黑色图像,直到找到白色像素。这是一个行的开始
  2. 递归遍历像素邻居,直到找到最远的像素。这是行的结尾
  3. 当您知道起点和终点时,您可以按atan2(endY-startY,endX-startX)计算每条线的斜率。现在,您可以分析比较线条。如果它们的斜率差异大于,比如说弧度(5度)的差值比线条不算平行。此解决方案适用于任意数量的行,它还提供每行所有像素的列表+行的数学方程式为AX + BY + C = 0.
  4. 如果你仍然坚持使用FFT 我建议旋转原始图像或FFT图像,这样至少有一条线与Y轴平行(FFT的表示在X轴上)。比检查第二条线是否平行更容易。如果它们是平行的,则它们都与y轴对齐,并且意味着整个FFT变换位于X轴上。只需检查几个中心行上方的FFT的所有像素都是零。如果不是这意味着线不平行,因为第一条线位于FFT图像中的X轴上,第二条线上下移动。 附:我没有解释如何旋转图像,所以至少有一行与Y轴对齐。如果在原始图像上执行此操作,只需计算渐变的方向(角度),找到最大值并旋转图像(减去以度为单位的最大值)。在FFT图像上,您也可以这样做,因为图像中的两条线在FFT中仍然看起来像两条线。

    重要提示:您的问题得到了其他人的许多不准确答案。以下是一些更正

    1. 不要使用Hough或Radon变换!它相对较慢,只需2行就可以轻松完成任务。
    2. 使用FFT时,您实际上可以知道线的位置。到目前为止,我们使用FFT的幅度图像,但也有相位图像,线的位置在相位图像中编码。
    3. 总结:我建议你实施我称之为最快运行时间的解决方案。如果图片有N个像素,您将平均O(N)步进行,而FFT只需至少O(N*log(N))步。

答案 2 :(得分:1)

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

要查找平行线,您可以使用其他技术,例如: