コーナーフィルタリング:スケルトンローカル線形回帰を単純に使用するMATLABの例

正確なカウントが必要なため、バイナリグラフが腐食した後、スケルトンを抽出する必要があります。分岐を削除した後、MATLAB独自の関数コーナーを呼び出してコーナーを抽出します。関連する操作はすべて組み込み関数です。

  • スケルトン関数を抽出します。J= bwmorph(I、 'skel'、refine_time); refine_timeはリファインメントの数です。値がInfの場合、スケルトンは1ピクセル幅のみにリファインされます。入力イメージと出力イメージIおよびJは次のとおりです。両方の2つの値の画像。以下は同じです。
  • スケルトン分岐解除関数:J = bwmorph(I、 'spur'、spur_time); spurはフォーク解除の数です。
  • コーナー検出関数:C = corner(I、corner_num); corner_numは抽出されるコーナーポイントの数で、デフォルトは200です。出力はcorner_num * 2サイズの行列で、各行はコーナーポイントの座標を表します。

バイナリグラフ、スケルトングラフ、デブランチグラフ、コーナー検出グラフは次のとおりです。

図の赤いアスタリスクはコーナーポイントです。コーナーポイントの表示コードは次のとおりです。

    C=corner(Ispur,corner_num);
    figure
    imshow(Ispur)
    hold on
    plot(C(:,1),C(:,2),'r*');    

 

出力コーナーポイントの総数は、入力されると予想されるコーナーポイントの総数とまったく同じであるため(予想されるコーナーポイントの総数がすべてのコーナーポイントの数を超えない限り)、コーナーポイントをさらにフィルタリングする必要があります。線形スケルトンの近くに分散されたコーナーポイントと、コーナーと交差点にあるコーナーポイントを維持します(フォークは事前にクリーンアップする必要があります。そうしないと、結果に影響します)。これもこの記事のコアです。アルゴリズムの紹介と概略図:

上の画像が入力バイナリ画像であると仮定すると、正方形はピクセルを表し、赤い正方形はコーナーピクセルを表し、白い正方形はスケルトンを構成するピクセルを表します。アルゴリズムは、ターゲットコーナーを中心として特定の範囲内で選択します。スケルトン上のすべてのピクセルの範囲(図では青)、カラーボックス、サイズ2R * 2R)、これらのピクセルの座標(xi) (コーナーピクセルを含む)、yi)線形回帰を実行して、線形関数\ hat {y} = \ hat {a} x + \ dot {\ hat {b}}と回帰係数、間隔推定値、残差、信頼区間、決定係数、F統計観測値、p値、誤差分散の推定値、およびサンプルの有意水準を取得します。ポイント。得られた1つまたは複数の値の線形結合に従って、トレーニング済みまたは経験的に事前設定されたしきい値threより大きいか小さいかが判断されます。このアルゴリズムは、決定係数R ^ 2を例として取り上げ、しきい値threを設定します。中心の特定の範囲内のスケルトンピクセルポイントの線形回帰の決定係数がしきい値threより大きい場合、コーナーポイントは直線または直線上にあると見なされます。それ以外の場合は、位置していると見なされます。コーナーまたは交差点で。

PS:線形回帰は、自己記述関数によって実現するか、関数regressを直接呼び出すことができます。呼び出し方法は次のとおりです。

  •  [b、bint、r、rint、stats] = regress(Y、X)

ここで、Yは従属変数の列ベクトル、Xは追加された独立変数の列ベクトルです(つまり、最初の列はすべて1で、2番目の列はxです)。出力bは回帰係数、bintは回帰係数の区間推定、rは残差、rintは信頼区間、statsは回帰モデルのテストに使用される4つの4つの値の行列です.4つ統計の値は、決定係数、F統計の観測値、テストのpの値、誤差分散の推定値として解釈されます。

テスト画像は、フォークを解除した後、画像の一部としてキャプチャされます。

いくつかのコーナー座標を設定します(147,124)(163,146)(181,142))(139,111)[下図の赤い円はコーナー位置です]

コード:

function JudgeList=LinearJudge(I,C,R)
    [m,n]=size(I);
    JudgeList=zeros(1,length(C));
    
    for c=1:length(C)
        pn=0;
        ci=C(c,2);
        cj=C(c,1);
        PointList=[];
        for i =ci-R:ci+R
            for j=cj-R:cj+R
                if i>=1 && i<=m && j>=1 && j<=n
                    if I(i,j)==255
                        pn=pn+1;
                        PointList(pn,:)=[i,j];
                    end
                end
            end
        end
        [b,bint,r,rint,stats]=regress(PointList(:,2),[ones(pn,1),PointList(:,1)]);
        JudgeList(c)=stats(1);
    end
end

入力は、バイナリイメージI(ここでは、0と255のみのイメージになります。0と1のバイナリイメージの場合は、255を1に変更するだけです)、コーナー座標行列C、および範囲半径Rです。PointListは、各コーナーポイントの範囲内のスケルトンピクセルポイントの座標であり、出力はすべてのコーナーポイントに対応する値であり、決定係数stats(1)がここで取得されます。

テストサンプルコード:

I=rgb2gray(imread('spur_01.jpg'));
I=uint8(im2bw(I)*255);%转为只有0和255的二值图像
C=[[147,124];[163,146];[181,142];[139,111]];
imshow(I)
hold on
plot(C(:,1),C(:,2),'ro')
R=ceil(sum(sum(I==255))/20);
result=LinearJudge(I,C,R);
thre=0.75;
JudgeList=LinearJudge(I,C,R);%调用算法
C2=C(find(JudgeList<=thre),:);
figure,
imshow(I)
hold on
plot(C2(:,1),C2(:,2),'go')

ここで、Rは、スケルトンを20で割って切り上げた長さです。C2は、条件を満たすコーナー座標(出力が3より大きい)であり、条件を満たすコーナーは緑色の円として表示されます。

画像全体に適用:(R = 5、thre = 0.72)

PS:テストの場合のみ、2つのパラメーターの特定の値は、デバッグやその他の方法で取得できます。アルゴリズムの出力属性値は、残差などを選択できます。

おすすめ

転載: blog.csdn.net/qq_36614557/article/details/106935524