2013-03-23 72 views
0

我想明白它是如何工作的。我相信我理解了这个概念:了解线条的霍夫变换

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

回答

0

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

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

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

+0

不幸的是,虽然这本书可以理解的解释这个概念,它然后把代码中没有太多直接的参考数字,只是说,该行通过采取蓄能器的最大发现,所以它不是黑色的倒置和白色。由于我是学生,我倾向于认为我错了,但我认为是时候在C里做点什么,看看会发生什么。感谢您的详细回复,我会记住您所说的内容。 – William 2013-03-23 05:22:50

+0

@William如果你不知道,你应该在MATLAB尝试了这一点,因为这将是更容易测试和东西。但是如果C是你的东西,那么继续。另外,就像我说的,注意你上面的代码有点陈旧。我实际上有来自我的机器视觉类的代码,其中我基于rho/theta参数化和梯度/ sobel方法实施了hough变换。如果您有兴趣,我可以将其附加到我的答案中。最后,如果我的回答回答了你的问题,那么接受它是个好习惯。 – Justin 2013-03-23 05:31:08

+0

我可能会坚持C并按照自己的步调一点一点地学习,不过谢谢。顺便说一句,我意识到我的评论上面的错误,也许它实际上是倒置的黑色和白色。抱歉忘了接受! – William 2013-03-23 05:59:50