Matlab はハフ変換ライン検出を実行します

直交座標系では、次のように画像内に直線があります。その線上に 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,4) 点を通る直線が一致するため、極直径は 0 になります。 (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