我试图准确理解它是如何工作的。我相信我理解这个概念:
对于所有边缘像素,找到通过它的所有线,并且对于这些线中的每一个,累加器阵列值(对应于斜率和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 :(得分:0)
请注意,您进行霍夫变换的方式是一种较旧的技术。大多数现代技术使用“常规脚”参数化(rho / theta)来解释线是垂直的情况。此外,一些人将使用索贝尔滤波器直接计算边缘点的梯度矢量,这些边缘点指向垂直于线的方向。这允许您直接计算边缘点的单个rho / theta值,而不是计算通过这些点的线的所有可能性(如在代码中所做的那样)。
但无论如何,对于您的情况,斜率和截距用于参数化线条。这些值被分箱,然后放入累加器中,如代码所示。对于单个边缘点,存在可以通过它的无限数量的线,但是通过仅使用斜率和截距的分箱值使这些线变得有限。在您的情况下,您可以使用91个可能的斜率值。共线点将导致某些“箱”比其他点积累更多的值。累加器中的这些局部峰值指示线(或更具体地,如果使用边缘检测器的边缘)位于图像内的位置。关于hough transform的维基百科文章给出了一个很好的例子。希望这有助于解决您的问题。