hough 变换检测直线的基本原理是 对X-Y 坐标系下的每一点(x,y),对应极坐标下为:
rho =x*cos(theta) +y* sin(theta) (1)
,因此,对x-y平面内的每一点,对应到极坐标系则为一条直线,如果直角坐标系下的点共线,则在极坐标的直线会相交于一点。因此,求得极坐标下相交最多的点,(rho, theta) ,代入(1),则可求出最多的点所在直线的方程。
将theta 划分为 1到 179 格,每格为1, 由(1),rho 的最大值为 sqrt(x*x+ y*y) , 可以推出
rho =sqrt(x*x+ y*y)* (cos(theta+theta2)) (2)
theta2 为任意角,因此可以知道 - sqrt(x*x+ y*y) < rho < sqrt(x*x+ y*y) ,取 theta 为 0-179 ,则对每一个theta ,代入(1) ,求得rho ,取整,累计求和,统计rho 最大值 ,如果有多个最大值,说明有多条直线?
以下程序能够基本实现检测直线功能,角度会有1度的误差。划分的时候以1为单位。
function [rho,thta]=my_hough(f)
[M,N]=size(f);
[r,c]=find(f);
L=length(r);
D=ceil(sqrt((M)*(M)+(N)*(N))); %rho=x*cos()+y*sin() ,rho最大值为sqrt((M)*(M)+(N)*(N))
H=zeros(2*D,180); %%注意现实中是0-179
for i=1:L
for theta=1:180
rho=ceil(r(i)*cos( theta*pi/180)+c(i)*sin(theta*pi/180));
if rho>0
H(D+rho,theta) = H(D+rho,theta)+1;
else
H(D+rho,theta) = H(D+rho,theta)+1;
end
end
end
[wuro,sita]=find(H==max(H(:))); %可能存在两种情况
%wuro-D ;%%%求得的rho=aa-D
rho=wuro(1)-D ;
thta=sita(1)*pi/180;
参考文献
数字图像处理 MATLAB 版本 冈萨雷斯 p297 。
学习 opencv 177-183