霍夫变换直线检测的原理
笛卡尔坐标(x,y坐标)系上的直线y=kx+b 可以在极坐标系上可以用下式表示
r=x cosθ + ysinθ ,
其中r为该原点到该直线的距离,θ为该直线和x轴的夹角。
那么可以通过计算每个点x,y上,假设经过该点的直线与x轴为θ ,然后θ 从(1~180度)进行计算,分别得到不同的r值。
最后统计图片中经过各点,各个角度的直线概率最高的(r,θ)值,
我们认为这个值就是图片中真正的直线对应的r, θ值。 也即图片中直线对应的Normal Line(法线)长度r及其与x轴的夹角θ
以下是其Matlab程序实现。以下程序首先读取图片,并得到图片的大小rows,columns.
然后用Counters=zeros(rmax,180)数组用来统计各个r, θ的概率。
找到概率值最高的r, θ.
然后重新遍历图片,当x,y值满足r=x cosθ + ysinθ 时即认为该点是检测到的直线上的点。
A=imread('1.bmp');
imshow(A);
A_gray=rgb2gray(A);
%Get The Image Size
[rows,columns]=size(A_gray);
%define and initiate the Counters.
rmax=round(sqrt(rows^2+columns^2))
Counters=zeros(rmax,180);
%Begin to count
tic %-------------start to timing.
for x=1:columns
for y=1:rows
if(A_gray(y,x)==0)
for m=1:180
r=round(x*cos(m*pi/180)+y*sin(m*pi/180));
if(r
Counters(r,m)=Counters(r,m)+1;
end
end
end%end of if(A_gray(y,x)==0)
end%end of y=1;rows
end
toc
%Get the line max probable,print the r (distance) and angle
tic
CounterMax=0
for i=1:rmax
for j=1:180
if(CounterMax
CounterMax=Counters(i,j);
iMax=i;%it's the r ,distance from the original to the line.
jMax=j;%it's the angle bettween the normal line and the x axis.
end
end
end
toc
CounterMax
iMax
jMax
Counters(iMax,jMax)
X=iMax/cos(pi*jMax/180)
Y=iMax/sin(pi*jMax/180)
%get the line and remove(strip away) the background.
tic
for x=1:columns
for y=1:rows
if(A_gray(y,x)==0)
r=round(x*cos(jMax*pi/180)+y*sin(jMax*pi/180));
if(r==iMax)
%only the dot on the line will be dark.
%other dot will be change to be white.
A_gray(y,x)=80;
else
A_gray(y,x)=255;
end
else
A_gray(y,x)=255;
end
end
end
toc
imshow(A_gray)