理解线的Hough变换

时间:2013-03-23 04:30:39

标签: matlab line hough-transform

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

相关问题