ドキュメンテーション

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

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) は、動的輪郭ベースのセグメンテーションを使用して、2 次元のグレースケール イメージ A を前景 (オブジェクト) 領域と背景領域にセグメント化します。出力イメージ bw は、前景が白 (論理値 true) で背景が黒 (論理値 false) のバイナリ イメージです。mask は、動的輪郭の初期状態を指定するバイナリ イメージです。mask 内のオブジェクト領域 (白) の境界は、イメージのセグメント化で輪郭を変化させるために使用する初期輪郭の位置を定義します。セグメンテーションの結果をより高速にかつ正確に取得するには、目的とするオブジェクト境界に近い初期輪郭の位置を指定してください。

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) は、セグメンテーションのさまざまな特性を制御するパラメーターを指定します。パラメーター名は省略形でも構いません。大文字と小文字は区別されません。

すべて折りたたむ

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

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');

入力引数

すべて折りたたむ

セグメント化されるイメージであり、グレースケール イメージとして指定されます。非スパースでなければなりません。

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

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

データ型: logical

セグメンテーションの変化を行うための反復の最大回数であり、数値スカラーとして指定されます。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);

すべて折りたたむ

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

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

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

輪郭が外側に拡大するか内側に縮小する傾向であり、スカラーとして指定されます。正の値は内側に縮小するバイアスを輪郭に設定します (縮小)。負の値は外側に拡大するバイアスを輪郭に設定します (拡大)。このパラメーターは輪郭を厳密に縮小 (または拡大) する保証にはなりません。このパラメーターが正の値であっても、実際には輪郭が拡大する可能性があります (その逆も同様です)。しかし、バイアスを指定したため、バイアスが設定されていない輪郭よりも拡大は鈍化します。

例: 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 の領域の穴を塗りつぶしてください。

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

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

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

  • 'edge' メソッドで正確なセグメンテーションを実現するには、mask の領域境界によって指定される初期輪郭がセグメント化されるオブジェクトの境界の外側になければなりません。動的輪郭には、既定により縮小のバイアスがかかっているからです。

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

アルゴリズム

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

activecontour は、現在の反復における輪郭位置が直近の 5 回の反復のいずれかと同じ場合、または最大反復回数に達した場合に、動的輪郭の変化を停止します。

参照

[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 で導入

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