图像处理中,常常遇到需要对图像中的特定形状进行识别的情景,如线条、圆弧等,如何有效地将其识别出来,业界常用算法是霍夫变换,霍夫变换依赖于二值化边缘图像提供的坐标。
直线在二值图像中可由两个变量显示,在笛卡尔坐标系,由斜率a和截距b进行表示;在极坐标系中,可由极径r和极角θ表示。由于直线在垂直状态时,斜率无穷大,无法表示,所以转换到极坐标更方便运算。因此,取直线方程的极坐标表达式为:
化简得:
在matlab中,使用hough函数来获得标准霍夫变换结果,代码如下:
%图像e
e=zeros(600,600);
for i=1:499
e(i,500-i)=1;
end
e=logical(e);
%函数变换
startTheta=-90;
endTheta=89.5;
step=0.01;
[H,T,R] = hough(e,'RhoResolution',1,'Theta',startTheta:step:endTheta);
%热图显示
imshow(mat2gray(H),'XData',T,'YData',R,...
'InitialMagnification','fit');
title('Hough transform of gantrycrane.png');
xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
colormap(hot);
%计算直线a,b
ma=max(max(H));
[rows,cols]=find(H==ma);
row=mean(rows);col=mean(cols);
theta=(col-1)*step+startTheta;
r=(row-1)+R(1);
a=-cot(theta/180*pi);
b=r/sin(theta/180*pi);
图像e是一个y=-x+500的直线,霍夫变换结果为y=-x+497.8,误差较大。
让人迷惑的是,霍夫空间不应该有负r存在,否则都进入复数域了,所以里面的门门道道还不是很清楚。