直线检测原理matlab,Hough变换 直线检测原理及其Matlab实现

霍夫变换直线检测的原理

笛卡尔坐标(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(r0)

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 lineand 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)

你可能感兴趣的:(直线检测原理matlab)