ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

activecontour

動的輪郭を使用した前景と背景へのイメージのセグメント化

構文

bw = activecontour(A,mask)
bw = activecontour(A,mask,n)
bw = activecontour(A,mask,method)
bw = activecontour(A,mask,n,method)
bw = activecontour(___,Name,Value)

説明

bw = activecontour(A,mask) は、動的輪郭セグメンテーションを使用して、イメージ A を前景 (オブジェクト) 領域と背景領域にセグメント化します。動的輪郭は、反復的処理をとおしてセグメンテーションを変化させます。既定の設定では、activecontour は反復を 100 回実行します。mask は、動的輪郭の初期状態を指定するバイナリ イメージです。mask 内のオブジェクト領域 (白) の境界は、イメージのセグメント化で輪郭を変化させるために使用する初期輪郭の位置を定義します。出力イメージ bw は、前景が白 (論理値 true)、背景が黒 (論理値 false) のバイナリ イメージです。

セグメンテーションの結果をより高速にかつ正確に取得するには、目的とするオブジェクト境界に近い初期輪郭の位置を指定してください。

bw = activecontour(A,mask,n) は、最大 n 回の反復で輪郭を変化させることでイメージをセグメント化します。

bw = activecontour(A,mask,method) は、セグメンテーションに使用される動的輪郭法として、'Chan-Vese''edge' のいずれかを指定します。

bw = activecontour(A,mask,n,method) は、指定された method を使用して、最大 n 回の反復で輪郭を変化させることによりイメージをセグメント化します。

bw = activecontour(___,Name,Value) は、セグメンテーションのさまざまな特性を制御するパラメーターを指定します。パラメーター名は省略形でも構いません。大文字と小文字は区別されません。

すべて折りたたむ

この例では、関数 activecontour の既定の設定を使用してイメージをセグメント化する方法を説明します。

グレースケール イメージを読み取り、それを表示します。

I = imread('coins.png');
imshow(I)
title('Original Image')

初期輪郭を指定して表示します。

mask = zeros(size(I));
mask(25:end-25,25:end-25) = 1;
figure
imshow(mask)
title('Initial Contour Location')

既定のメソッドと 300 回の反復を使用してイメージをセグメント化します。

bw = activecontour(I,mask,300);

結果を表示します。

figure
imshow(bw)
title('Segmented Image')

イメージを読み取り、それを表示します。

I = imread('toyobjects.png');
imshow(I)
hold on
title('Original Image');

セグメント化するオブジェクトの近くに初期輪郭位置を指定します。

mask = false(size(I));
mask(50:150,40:170) = true;

元のイメージ上に初期の輪郭を青で表示します。

visboundaries(mask,'Color','b');

'edge' メソッドと 200 回の反復を使用してイメージをセグメント化します。

bw = activecontour(I, mask, 200, 'edge');

最終的な輪郭を元のイメージ上に赤で表示します。

visboundaries(bw,'Color','r'); 
title('Initial contour (blue) and final contour (red)');

セグメント化されたイメージを表示します。

figure, imshow(bw)
title('Segmented Image');

イメージをワークスペースに読み取って表示します。初期輪郭位置を指定する指示を表示します。

I = imread('toyobjects.png');
imshow(I)
  
str = 'Click to select initial contour location. Double-click to confirm and proceed.';
title(str,'Color','b','FontSize',12);
disp(sprintf('\nNote: Click close to object boundaries for more accurate result.'))

初期輪郭を対話方式で指定します。

mask = roipoly;
  
figure, imshow(mask)
title('Initial MASK');

200 回の反復を指定してイメージをセグメント化します。

maxIterations = 200; 
bw = activecontour(I, mask, maxIterations, 'Chan-Vese');
  
% Display segmented image
figure, imshow(bw)
title('Segmented Image');

3 次元ボリューム イメージ データを読み込み、大きさが 1 の次元を削除します。

D = load('mri.mat');
A  = squeeze(D.D);

初期シード ポイントの 2 次元マスクを作成します。

seedLevel = 10;
seed = A(:,:,seedLevel) > 75;
figure
imshow(seed)

空の 3 次元シード マスクを作成し、そこにシード ポイントを挿入します。

mask = zeros(size(A));
mask(:,:,seedLevel) = seed;

動的輪郭でシード マスクを指定して、セグメンテーションを実行します。

bw = activecontour(A,mask,300);

セグメント化された 3 次元イメージを表示します。

figure;
p = patch(isosurface(double(bw)));
p.FaceColor = 'red';
p.EdgeColor = 'none';
daspect([1 1 27/128]);
camlight;
lighting phong

入力引数

すべて折りたたむ

セグメント化されるイメージ。非スパースの 2 次元または 3 次元数値配列として指定します。

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

セグメンテーションの始まりとなる初期輪郭であり、A と同じサイズのバイナリ イメージとして指定されます。

2 次元および 3 次元グレースケール イメージの場合、mask のサイズはイメージ A のサイズと同じでなければなりません。カラー イメージおよびマルチチャネル イメージの場合、mask は 2 次元論理配列で、最初の 2 次元がイメージ A の最初の 2 次元と同じでければなりません。

データ型: logical

セグメンテーションの変化で実行する反復の最大回数。数値スカラーとして指定します。activecontour は、最大反復回数に達したときに、動的輪郭の変化を停止します。また、activecontour は、現在の反復における輪郭位置が直近の 5 回の反復のいずれかと同じ場合にもその変化を停止します。

初期輪郭の位置 (mask で指定) がオブジェクトの境界から遠い場合、目的のセグメンテーション結果を得るためには、より大きい値を n に指定します。

データ型: double

セグメンテーションに使用される動的輪郭法。文字ベクトル 'Chan-Vese' または 'edge' に指定します。Chan および Vese の領域ベースのエネルギー モデルについては、[1] に説明があります。測地線動的輪郭と類似のエッジ ベースのモデルについては、[2] に説明があります。

データ型: char

名前/値のペアの引数

オプションの Name,Value 引数のペアをコンマ区切りで指定します。ここで、Name は引数名で、Value は対応する値です。Name は単一引用符 (' ') で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順番で指定できます。

例: bw = activecontour(I, mask, 200, 'edge','SmoothFactor',1.5);

すべて折りたたむ

セグメント化された領域の境界の滑らかさまたは均一性の度合い。'SmoothFactor' と正の数値スカラーで構成されるコンマ区切りのペアとして指定します。値を高くすると領域の境界は滑らかになりますが、詳細部分が除かれる可能性もあります。値が低いと領域境界が不均一になり (滑らかさが失われ) ますが、詳細部分が捉えられるようになります。滑らかさの既定値は選択するメソッドによって異なります。

例: bw = activecontour(I, mask, 200, 'edge','SmoothFactor',1.5);

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

輪郭が外側に拡大するか内側に縮小する傾向。'ContractionBias' とスカラーで構成されるコンマ区切りのペアとして指定します。正の値は内側に縮小するバイアスを輪郭に設定します (縮小)。負の値は外側に拡大するバイアスを輪郭に設定します (拡大)。このパラメーターは輪郭を縮小 (または拡大) する保証にはなりません。このパラメーターが正の値であっても、実際には輪郭が拡大する可能性があります。ただし、バイアスが設定されていない輪郭と比べ、バイアスを指定することで拡大は鈍化します。このパラメーターの典型的な値は -1 から 1 までになります。

例: bw = activecontour(I, mask, 200, 'edge','ContractionBias',0.4);

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

出力引数

すべて折りたたむ

セグメント化されたイメージであり、入力イメージ A と同じサイズのバイナリ イメージとして返されます。前景は白 (論理値 true)、背景は黒 (論理値 false) です。

ヒント

  • activecontour は、変化を開始する輪郭の初期状態として、mask の領域の境界を使用します。穴がある mask の領域によって予測できない結果が生じる可能性があります。imfill を使用して、mask の領域の穴を塗りつぶしてください。

  • 領域がイメージの境界と接触している場合、activecontour は、処理を進める前に領域から単一ピクセルのレイヤーを削除し、領域がイメージの境界に接触しないようにします。

  • 特に 'edge' メソッドの場合、結果をより高速かつ正確に取得するには、目的とするオブジェクト境界に近い初期輪郭の位置を指定してください。

  • 'edge' メソッドでは、動的輪郭が内側へと縮小する (閉じる) ように自然にバイアスがかけられます。イメージのグラデーションがまったくない場合、動的輪郭は自然に縮小します。一方、輪郭にバイアスがかけられない 'Chan-Vese' メソッドでは、イメージの特徴に応じて自由に輪郭の縮小や拡大が行われます。

  • 'edge' メソッドで正確なセグメンテーションを実現するには、初期輪郭をオブジェクトの境界の外側に配置するように指定してください。'edge' メソッドを使用した動的輪郭は、既定では縮小するバイアスがかけられます。

  • オブジェクト領域でグレースケールの強度が大きく異なる場合、'Chan-Vese' メソッド [1] では、イメージ内のすべてのオブジェクトがセグメント化されないことがあります。たとえば、イメージに背景よりも明るいオブジェクトと暗いオブジェクトが含まれる場合、通常、'Chan-Vese' メソッドでは、明るいオブジェクトか暗いオブジェクトのどちらか一方のみがセグメント化されます。

アルゴリズム

activecontour は、動的輪郭の変化を実装するために、[3] で説明されているメソッドと類似した Sparse-Field level-set メソッドを使用します。

参照

[1] T. F. Chan, L. A. Vese, Active contours without edges. IEEE Transactions on Image Processing, Volume 10, Issue 2, pp. 266-277, 2001

[2] V. Caselles, R. Kimmel, G. Sapiro, Geodesic active contours. International Journal of Computer Vision, Volume 22, Issue 1, pp. 61-79, 1997.

[3] R. T. Whitaker, A level-set approach to 3d reconstruction from range data. International Journal of Computer Vision, Volume 29, Issue 3, pp.203-231, 1998.

R2013a で導入

この情報は役に立ちましたか?