我想明白它是如何工作的。我相信我理解了这个概念:了解线条的霍夫变换
对于所有的边缘像素,找出所有通过它的线,并且对于这些线中的每一条线,累加器数组值(对应于斜率和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
不幸的是,虽然这本书可以理解的解释这个概念,它然后把代码中没有太多直接的参考数字,只是说,该行通过采取蓄能器的最大发现,所以它不是黑色的倒置和白色。由于我是学生,我倾向于认为我错了,但我认为是时候在C里做点什么,看看会发生什么。感谢您的详细回复,我会记住您所说的内容。 – William 2013-03-23 05:22:50
@William如果你不知道,你应该在MATLAB尝试了这一点,因为这将是更容易测试和东西。但是如果C是你的东西,那么继续。另外,就像我说的,注意你上面的代码有点陈旧。我实际上有来自我的机器视觉类的代码,其中我基于rho/theta参数化和梯度/ sobel方法实施了hough变换。如果您有兴趣,我可以将其附加到我的答案中。最后,如果我的回答回答了你的问题,那么接受它是个好习惯。 – Justin 2013-03-23 05:31:08
我可能会坚持C并按照自己的步调一点一点地学习,不过谢谢。顺便说一句,我意识到我的评论上面的错误,也许它实际上是倒置的黑色和白色。抱歉忘了接受! – William 2013-03-23 05:59:50