0

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

对于所有边缘像素,找到所有穿过它的线,并且对于这些线中的每一条,将累加器数组值(对应于斜率和 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
4

1 回答 1

0

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

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

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

于 2013-03-23T05:05:17.813 回答