2

セグメント化された画像のラベル マトリックスがあります。例えば、


1 1 1 2 2 2 3 3 3 4 4 4
1 1 1 2 2 2 3 3 4 4 4
1 1 2 2 2 3 3 4 4 4
1 1 1 2 2 2 3 3 4 4 4
1 1 1 2 2 2 3 3 3 4 4 4
1 1 1 2 2 2 3 3 3 4 4 4
1 1 1 2 2 2 3 3 4 4 4
1 1 1 2 2 2 3 3 4 4 4

次に、各オブジェクトのエッジのピクセル値が 1 でその他のピクセル値が 0 になるように、各オブジェクトの輪郭を描きたいと思います。

このようなもの


1 1 1 1 1 1 1 1 1 1
1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1
1 0 1 1 0 1 1 0 1
1 0 1 1 0 1 1 0 1
1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1
1 0 1 1 0 1 1 0 1 1 0 1
1 0 1 1 0 1 1
1 1 1 1 1 1 1 1 1

Matlabでこれを行う関数があることを願っていますが、わかりません。

4

3 に答える 3

2

@Laurent'による回答では、画像内のオブジェクトがどこでも少なくとも 3 ピクセル幅である限り、4 連結ラベリングを使用でき、機能します。

境界を 8 連結する必要がある場合、またはオブジェクトを狭くできる場合は、BWPERIMを繰り返し適用することを検討する必要があります(これがイメージであると仮定しAます)。

conn = 8; %# select connectedness
nLbl = max(A(:)); %# note this works even if some labels are missing

out = false(size(A)); %# preassign the output

for lbl = 1:nLbl
    %# get the perimeter for each object
    out = out | bwperim(A==lbl,connn);
end
于 2011-10-10T12:55:06.673 に答える
1

あなたのマトリックスにしましょうA、これがあなたが探しているものだと思います:

(conv2(A,[1 -2 1],'same') ~=0)|(conv2(A,[1; -2; 1],'same') ~=0)

あなたの例の結果は次のとおりです。

 1     1     1     1     1     1     1     1     1     1     1     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     0     1     1     0     1     1     0     1     1     0     1
 1     1     1     1     1     1     1     1     1     1     1     1
于 2011-10-10T11:51:18.890 に答える
0

matlab の構文をすぐに思い出せませんが、x-1、y-1 から x+1、y+1 までの値の最大値を決定し、最小値を減算する関数の行に沿ったアルゴリズムを提案します。同じ範囲。それが 0 の場合は 0 の出力が必要で、それ以外の場合は 1 が必要です。

おそらく、範囲外の座標に対して-1を返す各ピクセルの値を取得するコードなどを使用して、画像の端に合わせて少し調整する必要があるかもしれません。

于 2011-10-10T10:56:29.753 に答える