4

MATLABのbwboundaries関数を使用して、バイナリイメージの境界をマークできます。

すべてのセグメントの境界をバイナリイメージとして取得するにはどうすればよいですか?

画像をセグメント化しましたが、各セグメントにモルフォロジー演算を適用せずに、隣接する各セグメント間の境界をマークする方法があるかどうかを知りたいです。

私がやりたいことを説明するために画像を追加しました。実際、すべてのセグメント間にピンクの境界マーカーピクセルを保持するバイナリイメージを取得したいと思います。したがって、Steve Eddinsのオーバーレイ機能を使用して、元の画像でそれらをオーバーレイできます。

セグメンテーション結果のランダムな色のラベル付け:

ここに画像の説明を入力してください

セグメント間の大まかにマークされたピンクの境界:

ここに画像の説明を入力してください

4

3 に答える 3

5

各ピクセルの近傍内の強度範囲を見つける範囲フィルターを使用して、領域の境界を見つけることができます。これは、ラベル行列が領域境界でゼロ以外の範囲しか持たないという事実を利用しています。

im = imread('http://i.stack.imgur.com/qPiA3.png');
boundaries = rangefilt(im,ones(3)) > 0;
imoverlay(label2rgb(im),boundaries,[0 0 0]);

これらのエッジも 2 ピクセル幅です。実際、エッジは 2 ピクセル幅でなければならないと思います。そうしないと、領域は境界に対して不均一にピクセルを「失い」ます。

于 2012-01-29T00:16:34.763 に答える
3

侵食と膨張は非バイナリ イメージでも機能するため、次のように記述できます。

img = imread('http://i.stack.imgur.com/qPiA3.png');
ei = imerode(img,ones(3));
di = imdilate(img,ones(3));
boundaries = ei~=img | di~=img;

これにより、各色領域の端に境界がある白黒画像が生成されます (したがって、境界線は 2 ピクセル幅になります)。

ここに画像の説明を入力

これはピクセルの順序付けられたリストを として返すのではbwboundariesなく、入力として必要なbwperimものであるのような論理マスクを返すことに注意してください。imoverlay

于 2012-01-28T17:53:08.713 に答える
1

回り道として、 MATLABのエッジ機能を利用することを考えました。まず、label2gray操作のようなものを適用する必要があります。labelsは、以下のコードのセグメンテーション出力 (質問で提供される最初の画像) です。

grayLabels = mat2gray(255* double(labels) ./ double(max(labels(:)))); %label2gray
bw_boundaries = edge(grayLabels,0.001);
于 2012-01-29T00:25:46.007 に答える