Main Content

bwmorph3

バイナリ ボリュームのモルフォロジー演算

説明

J = bwmorph3(V,operation) は string または文字ベクトル operation を指定したモルフォロジー演算をバイナリ ボリューム V に適用します。bwmorph3 は、論理ボリューム J での演算結果を返します。

すべて折りたたむ

3 次元 MRI ボリューム データを読み込み、バイナリ ボリュームを作成します。volshow を使用して、灰色のボリューム データを表示します。

load mristack;
BW1 = mristack > 127;
cmap = [0.6 0.6 0.6];
volshow(BW1,Colormap=cmap);

1 に設定されているボクセルであり、かつ、0 に設定されているボクセルで囲まれているボクセルを削除するには、ボリューム データで "clean" 操作を実行します。削除するボクセルを決定するとき、"clean" 操作で 26 個の隣接するボクセルを考慮します。volshow を使用して結果を表示します。

BW2 = bwmorph3(BW1,"clean");
volshow(BW2,Colormap=cmap);

比較のために、ボリューム データで "majority" 操作を実行します。"majority" 操作は "clean" 操作と同様のタスクを実行します。ただし、ターゲット ボクセルの近傍にあるボクセルの半分以上 (つまり majority) が 1 に設定されている場合のみ、ボクセルを維持します。維持するボクセルを決定するとき、"majority" 操作も 26 個の隣接ボクセルを考慮します。volshow を使用して結果を表示します。

BW3 = bwmorph3(BW1,"majority");
volshow(BW3,Colormap=cmap);

この例では、bwmorph3 でサポートされるモルフォロジー演算のそれぞれがシンプル ボリュームでどのように機能するのかを説明します。

値が 1 の 3×3×3 のキューブを中心に含む、値が 0 の 9×9×3 の直方体を作成します。

innercube = ones(3,3,3);
cube_center = padarray(innercube,[3 3],0,'both')
cube_center = 
cube_center(:,:,1) =

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


cube_center(:,:,2) =

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


cube_center(:,:,3) =

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

remove 操作でのピクセルの Off 設定

'remove' 演算を使用して、内側のキューブの中央ボクセルを 0 に設定します。この操作は、'on' ボクセルによって完全に囲まれた、任意の 'on' ボクセルの値を、'off' に設定します。

remove_center = bwmorph3(cube_center,'remove')
remove_center = 9x9x3 logical array
remove_center(:,:,1) =

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


remove_center(:,:,2) =

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


remove_center(:,:,3) =

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

Fill 演算でのピクセルの On 設定

'fill' 演算を使用して、内側のキューブの中央ボクセルを 1 に設定します。この操作は、'on' ボクセルによって完全に囲まれた、任意の 'off' ボクセルの値を、'on' に設定します。

fill_center = bwmorph3(remove_center,'fill')
fill_center = 9x9x3 logical array
fill_center(:,:,1) =

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


fill_center(:,:,2) =

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


fill_center(:,:,3) =

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

Clean 演算での未連結ピクセルの除去

'clean' 演算を使用して、1 に設定されているがボリュームのコンポーネントに連結していない散在ボクセルすべてを削除します。この例では、2 番目平面にあるランダムなボクセルを 1 に設定することで、散在ボクセルを作成し、'clean' 演算を使用してそれを削除します。

cube_center(2,2,2) = 1
cube_center = 
cube_center(:,:,1) =

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


cube_center(:,:,2) =

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


cube_center(:,:,3) =

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

cube_cleaned = bwmorph3(cube_center,'clean')
cube_cleaned = 9x9x3 logical array
cube_cleaned(:,:,1) =

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


cube_cleaned(:,:,2) =

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


cube_cleaned(:,:,3) =

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

過半数の検出

'majority' 演算を使用して、cube_center の過半数を 検出します。この演算では、ボクセルの 26 個の連結された隣接ボクセルの半数以上 (majority) が 1 に設定されている場合にだけボクセルが維持されます。

cube_major = bwmorph3(cube_center,'majority')
cube_major = 9x9x3 logical array
cube_major(:,:,1) =

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


cube_major(:,:,2) =

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


cube_major(:,:,3) =

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

骨格に類似した形状の作成

分岐点と終点のオプションを描くには、別の小さな行列 (今回は骨格のような線形の形状) を作成します。

x1 = eye(5);
x2 = zeros(5);
x2(3,3) = 1;
x3 = x2;
shape = cat(3,x1,x2,x3)
shape = 
shape(:,:,1) =

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


shape(:,:,2) =

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


shape(:,:,3) =

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

終点の検出

形状の終点を 'endpoints' 演算を使用して検出します。この形状には、3 つの終点があります。1 番目の平面で対角の両端と、3 番目の平面の中央を通る線の端です。

shape_endpts = bwmorph3(shape,'endpoints')
shape_endpts = 5x5x3 logical array
shape_endpts(:,:,1) =

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


shape_endpts(:,:,2) =

   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0


shape_endpts(:,:,3) =

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

分岐点の検出

形状の分岐点を 'branchpoints' 演算を使用して検出します。形状には、1 つの分岐点があります。対角線と水平線が交差するところです。

shape_brpts = bwmorph3(shape,'branchpoints')
shape_brpts = 5x5x3 logical array
shape_brpts(:,:,1) =

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


shape_brpts(:,:,2) =

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


shape_brpts(:,:,3) =

   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0

入力引数

すべて折りたたむ

入力ボリューム。数値配列または logical 配列として指定します。数値入力の場合、非ゼロのピクセルは 1 (true) であると見なされます。

bwmorph3 は 1 次元、2 次元または 3 次元配列を受け付けます。1 次元または 2 次元の入力配列を指定する場合、bwmorph3 は、3 次元ボリュームに対して定義されているモルフォロジー演算を実行します。2 次元の処理を実行する場合は、代わりに bwmorph を使用します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

実行するモルフォロジー演算。以下の文字ベクトルまたは string スカラーのいずれかに指定します。これらの演算の例については、モルフォロジー演算の説明を参照してください。

操作

説明

'branchpoints'

スケルトンの分岐点を検出する。分岐点は、複数の分岐が交差するジャンクションのボクセルです。

分岐点を見つけるには、イメージをスケルトン化しなければなりません。スケルトン化されたイメージを作成するには、bwskel を使用します。

'clean'

0 に設定することで、孤立したボクセルを削除します。孤立ボクセルは、1 に設定されている独立した 26 連結ボクセルで、0 に設定されているボクセルに囲まれているものです。

'endpoints'

スケルトンの終点を検出します。終点は分岐の端にあるボクセルです。

メモ: 終点を見つけるには、イメージをスケルトン化しなければなりません。スケルトン化されたイメージを作成するには、bwskel を使用します。

'fill'

1 に設定することで、内部の孤立ボクセルを塗りつぶします。内部の孤立ボクセルは個別のボクセルで、0 に設定されており、1 に設定されているボクセルで (6 個に連結されて) 囲まれています。

'majority'

1 に設定されているボクセルを維持します。ただし 3 x 3 x 3 で、26 個の隣接に連結されたものの中で 14 個以上 (majority) のボクセルが 1 に設定されている場合です。他の場合は、ボクセルを 0 に設定します。

モルフォロジー演算の説明を参照してください。

'remove'

0 に設定して内部ボクセルを削除します。内部ボクセルは個別のボクセルで、1 に設定されており、1 に設定されているボクセルで (6 個に連結されて) 囲まれています。

データ型: char | string

出力引数

すべて折りたたむ

モルフォロジー演算後のボリューム。入力ボリューム V と同じサイズの logical 配列として返されます。

ヒント

  • 3 次元ボリュームでモルフォロジー演算の収縮または膨張を行うには、関数 imerode または imdilate に構造化要素 ones(3,3,3) を指定して使用します。

  • 3 次元ボリュームで、モルフォロジー クロージング、オープニング、トップハット フィルター処理またはボトムハット フィルター処理を実行するには、関数 imcloseimopenimtophat、または imbothat に構造化要素 ones(3,3,3) を指定して使用します。

拡張機能

バージョン履歴

R2018a で導入

すべて展開する