【问题标题】:Understanding the Hough transform for lines了解线的霍夫变换
【发布时间】:2013-03-23 04:30:39
【问题描述】:

我试图准确地了解它是如何工作的。我相信我理解这个概念:

对于所有边缘像素,找到所有穿过它的线,并且对于这些线中的每一条,将累加器数组值(对应于斜率和 y 截距)加 1。穿过许多边缘点的线将具有累加器数组中的许多选票。

我不明白的是我找到的用于实现它的代码。首先,我相信我们可以假设,在应用边缘检测器之后,边缘像素具有非零值,而非边缘为 0。在我教科书的代码中,程序搜索所有具有零值的点,并且,对于所有通过的线,将相应的累加器值增加 1。我认为它会寻找通过边缘点(非零)的线,而不是空白空间?有人可以向我解释这部分吗?

以下是我在一本图像处理教科书中找到的 Matlab 代码。我没有测试它,因为我正在使用 C++。 %messages 是我对特定行的作用的理解:

function HTline(inputimage)

[rows,columns] = size(inputimage);

acc1 = zeros(rows,91);
acc2 = zeros(columns,91);

for x = 1:columns
  for y = 1:rows
    if(inputimage(x,y)==0                  %If pixel=0, i.e., non-edge
      for m = -45:45                       %For a certain range of slope values
        b = round(y-tan((m*pi)/180)*x);    %Calculate y-intercept for slope values
        if (b<rows & b>0)                  %If y-intercept is within the image height
          acc1(b,m+45+1)=acc1(b,m+45+1)+1; %Increase accumulator values. What?
        end
      end
      for m=45:135                         %etc
        b=round(x-y/tan((m*pi)/180));
        if(b<columns & b>0)
          acc2(b,m-45+1)=acc2(b,m-45+1)+1;
        end
      end
    end
  end
end

【问题讨论】:

    标签: matlab line hough-transform


    【解决方案1】:

    William,这取决于您如何定义边缘所在的位置。通常,图像被转换为​​一些二进制掩码,边缘值存储为 true (1s),非边缘值存储为 false (0s),因此您的担忧似乎是正确的。也许如果你可以从你的书中添加一些上下文或一些释义,那么也许他们可以为他们为什么使用假(0)作为边缘值提供理由,但是任何一种表示都不能提供优于另一种的优势;这只是惯例。

    请注意,您进行霍夫变换的方式是一种较旧的技术。大多数现代技术使用“正常脚”参数化(rho/theta)来解释直线垂直的情况。此外,有些人会使用索贝尔滤波器直接计算边缘点的梯度向量,这些点指向直线的法线方向。这允许您直接计算边缘点的单个 rho/theta 值,而不是计算通过这些点的线的所有可能性(如您的代码中所做的那样)。

    但无论如何,对于您的情况,斜率和截距用于参数化线。这些值被分箱,然后放入累加器中,如代码所示。对于单个边缘点,有无数条线可以通过它,但这些线是通过仅使用斜率和截距的分箱值而变得有限的。在您的情况下,您使用 91 个可能的斜率值。共线的点将导致某些“箱”比其他“箱”积累更多的值。累加器中的这些局部峰值指示线(或更具体地说,如果使用边缘检测器,则为边缘)在图像中的位置。在hough transform 的维基百科文章中给出了一个很好的例子。希望这对您的问题有所帮助。

    【讨论】:

    • 不幸的是,虽然这本书可以理解地解释这个概念,但它把代码放在一个没有太多直接参考的图中,只是说这些行是通过取累加器的最大值来找到的,所以它不是黑白颠倒。由于我是学生,我倾向于认为我错了,但我认为是时候用 C 语言做点什么,看看会发生什么。感谢您的详细回复,我会记住您所说的。
    • @William 如果你不确定你应该在 matlab 中尝试一下,因为它会更容易测试和填充。但是,如果 C 是你的事,那就继续吧。另外,就像我说的,请注意上面的代码有点过时了。我实际上有来自我的机器视觉类的代码,我在其中实现了基于 rho/theta 参数化和梯度/sobel 方法的霍夫变换。如果您有兴趣,我可以将其附加到我的答案中。最后,如果我的回复回答了您的问题,最好接受它。
    • 我可能会坚持使用 C 语言并按照自己的节奏一点一点地学习,但还是要感谢。顺便说一句,我意识到上面评论中的错误,也许它实际上是黑白颠倒的。抱歉忘记接受了!
    猜你喜欢
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多