我在Octave上玩图像处理和hough变换很有趣,但结果不是预期的结果。 这是我的边缘图像: 这是我的hough累加器(x轴是以度为单位的角度,y轴是半径): 我觉得我错过了水平条纹,但是在0/180角度值的累加器中没有局部最大值。
另外,对于垂直条纹,半径的值应该等于边缘图像的x值,而是r的值非常高:
exp:图像左侧的第一条垂直线具有x = 20(近似)的等式 - > r.r = x.x + y.y - > r = x - > R = 20
检测到的总体结果线与边缘完全匹配:
正如您所看到的那样,累加器的最大值被满意地检测到了,但是得到的线条和半径值太高而且缺少θ值。
看起来霍夫变换累加器几乎与图像不对应...
有人可以帮我弄清楚为什么以及如何纠正它? 这是我的代码:
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
提前谢谢。
答案 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次更改,其余代码就可以正常工作。