3

私はこのバイナリイメージを持っていますbw:

ここに画像の説明を入力

いくつかの測定を実行するオブジェクトのエッジ。しかし、最初に、両方のエッジに対してカーブ フィッティングを行う必要があります。結果は、エッジを表す 2 つの滑らかな曲線になります。

各エッジのインデックスがありますが、xy データをフィッティング関数への入力データにする際に使用できません。つまり、それらはそうではなくxf(x)実際には、それらはすべて同じ値 (1) で位置が異なります。と言うのは正しくありません[x y]=find(BW)yこれは の値ではありませんxが、それらを使用してバイナリ イメージをスケーリングする方法があるはずです。私は混乱しているようで、ここで立ち往生しています。

推奨事項はありますか?

4

1 に答える 1

4

なぜ使用しないのpolyfitですか?

[y x] = find( bw );  %// get x y coordinates of all curve points

ここで使用する必要がある 2 つの小さな「トリック」があります。

  1. 曲線が 2 つあるため、データ ポイントを左右の曲線に分割する必要があります。

    right = x<300;
    xr = x(right);
    yr = y(right);
    xl = x(~right);
    yl = y(~right);
    
  2. 曲線は垂直に近いためx=f(y)、「クラシック」よりもフィットする方がよいでしょうy=f(x):

    pr = polyfit( yr, xr, 3 );  %// fit 3rd deg poly
    pl = polyfit( yl, xl, 3 ); 
    

これで、それらをプロットできます

yy = linspace( 1, size(bw,1), 50 );

figure; imshow(bw, 'border', 'tight' );
hold all
plot( polyval( pr, yy ), yy, '.-', 'LineWidth', 1 );
plot( polyval( pl, yy ), yy, '.-', 'LineWidth', 1 );

そして、あなたは得る:

ここに画像の説明を入力

推定された曲線から新しい洗練されたマスクを作成する場合は、次の操作を実行できます。

yy = 1:size(bw,1);  %// single value per row
xxr=polyval(pr,yy); %// corresponding column values
xxl=polyval(pl,yy);

同じサイズの新しいマスクを設定します

nbw = false(size(bw)); 
nbw( sub2ind(size(bw),yy,round(xxr)) )=true;
nbw( sub2ind(size(bw), yy, round(xxl) )) = true; 

そして結果

figure;imshow(nbw,'border','tight');

ここに画像の説明を入力

于 2016-04-11T06:59:16.477 に答える