霍夫(Hough)变换:
一条直线在直角坐标下可以用y=kx+b来表示,霍夫变换的主要思想是将该方程的参数和变量交换,即用x,y作为参数,k,b作为坐标变量,所以在直角坐标下的直线y=kx+b在参数坐标上表示为点(k,b),而直角坐标上的点(x1,y1)则在参数坐标下表示为一条直线。
算法描述:
hough空间与我们平时接触的笛卡尔坐标系不同,在笛卡尔坐标系中,直线垂直于X坐标时,其斜率无穷大,没有办法表示,为了计算方便,将参数空间的坐标表示为极坐标下的ρ和θ,因为同一直线上的点对应的(ρ, θ)是相同的,因此,可以先将图片进行边缘检测,然后对图像上每一个非零像素点,在参数坐标下变换为一条直线,那么在直线属于同一条直线的点便在参数空间形成多条直线并交于一点
原笛卡尔坐标系下的一个点对应霍夫空间的一条曲线,例如(1,1,),(2,2),(3,3)分别对应霍夫空间中的曲线P1=cos(θ)+sin(θ),P2=2cos(θ)+2sin(θ),P3=3cos(θ)+3sin(θ)
他们相交的点在0-pi范围内,交点只有一个,这个交点(ρ, θ)就是笛卡尔坐标系中(1,1),(2,2),(3,3)所构成的直线的参数。
matlab代码实现:
%% 霍夫直线检测
function A=line_detection(im_edge)
[row,col]=size(im_edge); %图像大小
p_max=floor(sqrt((row)^2+(col)^2))+1; %原点到直线最远的距离,就是到图像右上角的距离
accumulation=zeros(p_max,180);
theta=[0:pi/180:pi];%角度
max_num=0;
A=0;
%遍历图像,统计映射的(P,theta),选取最大的统计量对应的角度
for n=1:row
for m=1:col
if(im_edge(n,m)==1)
for k=1:180
p=(m*cos(theta(k)))+(n*sin(theta(k)));
p_int=round(p/2+p_max/2);
accumulation(p_int,k)=accumulation(p_int,k)+1;
if accumulation(p_int,k)>max_num
max_num=accumulation(p_int,k);
A=theta(k);
end
end
end
end
end