与图像不匹配的霍夫累加器的说明

时间:2015-05-07 17:39:07

标签: octave hough-transform

我在Octave上玩图像处理和hough变换很有趣,但结果不是预期的结果。 这是我的边缘图像:I am expecting local maxima for angles with values around 0/180deg and 90/270deg 这是我的hough累加器(x轴是以度为单位的角度,y轴是半径):The local maxima are around 100deg and 270deg 我觉得我错过了水平条纹,但是在0/180角度值的累加器中没有局部最大值。

另外,对于垂直条纹,半径的值应该等于边缘图像的x值,而是r的值非常高:

exp:图像左侧的第一条垂直线具有x = 20(近似)的等式 - > r.r = x.x + y.y - > r = x - > R = 20

检测到的总体结果线与边缘完全匹配:

  • 检测到最大值的Acculmulator:Maximas are stisfyingly detected
  • 结果行:radius values are too high and theta values are missing

正如您所看到的那样,累加器的最大值被满意地检测到了,但是得到的线条和半径值太高而且缺少θ值。

看起来霍夫变换累加器几乎与图像不对应...

有人可以帮我弄清楚为什么以及如何纠正它? 这是我的代码:

function [r, theta] = findScratches (img, edge)

hough = houghtf(edge,"line", pi*[0:360]/180);
threshHough = hough>.5*max(hough(:));

[r, theta] = find(threshHough>0);

%deg to rad for the trig functions
theta = theta/180*pi; 
%according to octave doc r range is 2*diagonal 
%-> bring it down to 1*diagonal or all lines are out of the picture
r = r/2;

%coefficients of the line y=ax+b
a = -cos(theta)./sin(theta);
b = r./sin(theta);

x = 1:size(img,2);
y = a * x + b;


figure(1)
imagesc(edge);
colormap gray;
hold on;
for i=1:size(y,1)
axis ij;
plot(y(i,:),x,'r','linewidth',1);
end
hold off;

endfunction

提前谢谢。

4 个答案:

答案 0 :(得分:1)

你肯定是在正确的轨道上。在查找热点之前,模糊累加器图像会有所帮助。另外,为什么在进行霍夫变换之前不要快速侵蚀和扩张?

答案 1 :(得分:1)

我有同样的问题 - 检测到的线具有正确的斜率但被移位。问题是r函数调用返回的find(threshHough>0)[0,2*diag]的区间内,而Hough变换在{{1}的区间内以r的值运行}}。因此,如果您更改行

[-diag,diag]

r=r/2

您将获得正确的偏移。

答案 2 :(得分:0)

让我们定义一个角度矢量(弧度): 角度= PI * [0:360] / 180

你不应该采取这种行动:theta = theta / 180 * pi。

将其替换为:theta = angles(theta),其中θ是索引

答案 3 :(得分:0)

上面评论的一些人建议通过

将r调整到-diag到+ diag范围

R = R-大小(霍夫,1)/ 2

这对我很有用。然而另一个不同之处在于我使用默认角度来计算角度为-90到+90的Hough变换。向量中的theta范围是+1到+181。所以它需要调整-91,然后转换为弧度。

theta =(theta-91)* pi / 180;

如果进行了2次更改,其余代码就可以正常工作。