Main Content

activecontour

動的輪郭 (snakes) 領域拡張法を使用した前景と背景へのイメージのセグメント化

説明

"動的輪郭" 法は、"snakes" とも呼ばれる、反復的な領域拡張を行うイメージ セグメンテーション アルゴリズムです。動的輪郭アルゴリズムを使用して、イメージ上で初期曲線を指定してから、関数 activecontour を使用して、オブジェクト境界に向かってカーブを変化させます。

BW = activecontour(A,mask) は、動的輪郭を使用して、イメージ A を前景 (オブジェクト) 領域と背景領域にセグメント化します。

mask 引数は、動的輪郭の初期状態を指定するバイナリ イメージです。mask 内のオブジェクト領域 (白) の境界は、イメージのセグメント化で輪郭を変化させるために使用する初期輪郭の位置を定義します。出力イメージ BW は、前景が白 (logical true)、背景が黒 (logical false) のバイナリ イメージです。

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

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

BW = activecontour(A,mask,method) は、セグメンテーションに使用される動的輪郭法として、"Chan-Vese""edge" のいずれかを指定します。RGB イメージの場合のメソッドは "Chan-Vese" でなければなりません。

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

BW = activecontour(___,Name,Value) は、セグメンテーションのさまざまな特性を制御する名前と値のペアの引数を指定します。

すべて折りたたむ

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

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

Figure contains an axes object. The axes object with title Original Image contains an object of type image.

対象オブジェクトの周囲の初期輪郭を指定します。輪郭を表示します。

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

Figure contains an axes object. The axes object with title Initial Contour Location contains an object of type image.

関数 activecontour を使用して、イメージをセグメント化します。既定では、この関数は 100 回反復してセグメンテーションを行います。

bw = activecontour(I,mask);

結果を表示します。元の輪郭がオブジェクト境界の近くにないため、100 回の反復後でも、オブジェクトは背景から完全にはセグメント化されていません。

imshow(bw)
title('Segmented Image, 100 Iterations')

Figure contains an axes object. The axes object with title Segmented Image, 100 Iterations contains an object of type image.

セグメンテーションを続けるには、反復回数を増やします。300 回の反復後、オブジェクトが背景から完全にセグメント化されます。

bw = activecontour(I,mask,300);
imshow(bw)
title('Segmented Image, 300 Iterations')

Figure contains an axes object. The axes object with title Segmented Image, 300 Iterations contains an object of type image.

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

I = imread('toyobjects.png');
imshow(I)

関数 drawrectangle を使用して、対象オブジェクトの近くに初期輪郭を描画します。輪郭の描画後、関数 createMask を使用して、マスクを作成します。

r = drawrectangle;

mask = createMask(r);

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

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

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

hold on;
visboundaries(bw,'Color','r'); 

セグメンテーションの結果を元のイメージ上に表示します。前景のオブジェクトは青色になっています。

figure
imshow(labeloverlay(I,bw));

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

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

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

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

Figure contains an axes object. The axes object contains an object of type image.

空の 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

Figure contains an axes object. The axes object contains an object of type patch.

入力引数

すべて折りたたむ

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

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

セグメンテーションの始まりとなる初期輪郭であり、A と同じサイズのバイナリ イメージとして指定されます。2 次元および 3 次元グレースケール イメージの場合、mask のサイズはイメージ A のサイズと同じでなければなりません。カラー イメージおよびマルチチャネル イメージの場合、mask は 2 次元 logical 配列で、最初の 2 次元がイメージ A の最初の 2 次元と同じでければなりません。

ROI オブジェクトを使用して、マスクを対話的に作成できます。たとえば、関数 drawpolygon を使用して多角形 ROI を描画し、次に関数 createMask を使用して、その ROI からマスクを作成します。

データ型: logical

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

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

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

RGB イメージの場合のメソッドは "Chan-Vese" でなければなりません。

データ型: char | string

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

例: SmoothFactor=1.5

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: "SmoothFactor",1.5

セグメント化された領域の境界の滑らかさまたは均一性の度合い。非負の数値として指定します。値を高くすると領域の境界は滑らかになりますが、詳細部分が除かれる可能性もあります。値が低いと領域境界が不均一になり (滑らかさが失われ) ますが、詳細部分が捉えられるようになります。既定の滑らかさの値は、"Chan-Vese" 法の場合は 0"edge" 法の場合は 1 です。

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

輪郭が外側に拡大するか内側に縮小する傾向。数値として指定します。正の値は内側に縮小するバイアスを輪郭に設定します (縮小)。負の値は外側に拡大するバイアスを輪郭に設定します (拡大)。この引数は輪郭を縮小または拡大する保証にはなりません。この引数が正の値であっても、実際には輪郭が拡大する可能性があります。ただし、バイアスが設定されていない輪郭と比べ、バイアスを指定することで拡大は鈍化します。この引数の典型的な値は -1 から 1 までになります。既定の縮小バイアスは、"Chan-Vese" 法の場合は 0"edge" 法の場合は 0.3 です。

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

出力引数

すべて折りたたむ

セグメント化されたイメージ。入力イメージ A と同じサイズの logical 配列として返されます。前景は白 (logical true)、背景は黒 (logical false) です。

データ型: logical

ヒント

  • activecontour は、変化を開始する輪郭の初期状態として、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 で導入