matlab进行Hough变换线条检测

直角坐标系中,图片存在直线如下:线上取3点(0,4)、(1,2)、(2,0)。

 以上3点任一点可通过任意多直线,取一条直线到原点(0,0)的距离为极坐标的极径,再取极径与横坐标轴形成夹角,则每条直线可由极坐标上的一个点表示。

如:下图为通过(0,4)点的一条直线,原点(0,0)与该条直线的距离为极径,长度为3.9,极径与横坐标轴的夹角,81°,可得到一个极坐标中的点(3.9,81)。

 下图为上图直角坐标系中直线转换为极坐标后的一个点(3.9,81)。

通过(0,4)点的直线不仅有上图中的1条,而可以有任意多条。通过(0,4)点的每条直线对应极坐标中的一个点,可得到极坐标中的一条曲线。

过(0,4)点,间隔5°做得直线,使用极坐标表示,matlab程序与极坐标结果如下:

x=0;y=4;
a=zeros(1,72);
for jiaodu=1:72
    a(jiaodu)=tan(jiaodu*5/180*3.14);
end
b=-1;
[i,j]=size(a);
c=zeros(i,j);
for z=1:j
    c(z)=0-a(z)*x-b*y;
end
d=zeros(i,j);
zeta=zeros(i,j);
for w=1:j
      d(w)=abs(c(w))/(a(w)^2+b^2)^0.5;
      y0=(-1*b*c(w))/(a(w)^2+b^2)^0.5;
      x0=(-1*a(w)*c(w))/(a(w)^2+b^2)^0.5;
      if x0<=0 && y0>=0
          zeta(w)=atan(y0/x0)*180/3.14+180;
      else
          zeta(w)=atan(y0/x0)*180/3.14;
    end
end
figure(1);
scatter(zeta,d);

夹角为90°时得到最大极径4,夹角为0°与180°时极径为0,因为此时通过(0,4)点的直线与纵坐标轴重合,过(0,0)点。

 将直角坐标系上的3点(0,4)、(1,2)、(2,0),做同样的变换。matlab程序与极坐标结果如下:

x=[0,1,2];
y=[4,2,0];
[m,v]=size(x);

a=zeros(1,72);
for jiaodu=1:72
    a(jiaodu)=tan(jiaodu*5/180*3.14);
end
b=-1;
[i,j]=size(a);
c=zeros(i,j);

for q=1:v
for z=1:j
    c(z)=0-a(z)*x(q)-b*y(q);
end
d=zeros(i,j);
zeta=zeros(i,j);
for w=1:j
      d(w)=abs(c(w))/(a(w)^2+b^2)^0.5;
      y0=(-1*b*c(w))/(a(w)^2+b^2)^0.5;
      x0=(-1*a(w)*c(w))/(a(w)^2+b^2)^0.5;
    if x0<=0 && y0>=0
          zeta(w)=atan(y0/x0)*180/3.14+180;
      else
          zeta(w)=atan(y0/x0)*180/3.14;
    end
end
hold on;
scatter(zeta,d);
end

 可见3条极坐标曲线有一个交汇点。代表通过3点的所有直线中,有3条直线重合,即3点在同一条直线上,因此检测到一条图片中的直线。

猜你喜欢

转载自blog.csdn.net/weixin_56832351/article/details/129199839