Main Content

grabcut

グラフに基づく反復セグメンテーションを使用した前景と背景へのイメージのセグメント化

説明

BW = grabcut(A,L,ROI) は、イメージ A を前景領域と背景領域にセグメント化します。ラベル行列 L はイメージの部分領域を指定します。ROI は初期の関心領域を指定する論理マスクです。

BW = grabcut(A,L,ROI,foremask,backmask) はイメージ A をセグメント化します。foremaskbackmask はイメージ内のピクセルを前景および背景としてそれぞれ指定するマスクです。

BW = grabcut(A,L,ROI,foreind,backind) は、イメージ A をセグメント化します。foreindbackind は前景および背景としてそれぞれマークされるイメージ内のピクセルの線形インデックスを指定します。

BW = grabcut(___,Name,Value) は、セグメンテーションの特性を制御する名前と値のペアを使用してイメージをセグメント化します。

すべて折りたたむ

RGB イメージをワークスペースに読み取ります。

RGB = imread('peppers.png');

ラベル行列を生成します。

L = superpixels(RGB,500);

関心領域を指定し、マスク イメージを作成します。

imshow(RGB)
h1 = drawpolygon('Position',[72,105; 1,231; 0,366; 104,359;...
        394,307; 518,343; 510,39; 149,72]);

roiPoints = h1.Position;
roi = poly2mask(roiPoints(:,1),roiPoints(:,2),size(L,1),size(L,2));

元のイメージ、ラベル行列および ROI を指定し、grabcut 処理を実行します。

BW = grabcut(RGB,L,roi);
imshow(BW)

マスクされたイメージを作成します。

maskedImage = RGB;
maskedImage(repmat(~BW,[1 1 3])) = 0;
imshow(maskedImage)

3 次元ボリューム データを読み込みます。

load mristack
V = mristack;

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

seedLevel = 10;
fseed = V(:,:,seedLevel) > 75;
bseed = V(:,:,seedLevel) == 0;

前景と背景のシード ポイントを表示します。

imshow(fseed)

imshow(bseed)

シード ポイントを空の 3 次元マスクに配置します。

fmask = zeros(size(V));
bmask = fmask;
fmask(:,:,seedLevel) = fseed;
bmask(:,:,seedLevel) = bseed;

初期の関心領域を作成します。

roi = false(size(V));
roi(10:end-10,10:end-10,:) = true;

ラベル行列を生成します。

L = superpixels3(V,500);

GrabCut を実行します。

bw = grabcut(V,L,roi,fmask,bmask);

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

montage(reshape(bw,size(V)))

入力引数

すべて折りたたむ

入力イメージまたは入力ボリューム。2 次元グレースケール イメージ、2 次元トゥルーカラー イメージ、または 3 次元グレースケール イメージとして指定します。グレースケール イメージのみ、データ型 int16 を指定できます。

データ型: single | double | int16 | uint8 | uint16

ラベル行列。数値配列として指定します。

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

関心領域。logical 配列として指定します。関心領域を定義するすべてのピクセルは true と等しくなります。

データ型: logical

前景マスク。logical 配列として指定します。

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

背景マスク。logical 配列として指定します。

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

前景のピクセルのインデックス。線形インデックスのベクトルとして指定します。

データ型: double

背景のピクセルのインデックス。線形インデックスのベクトルとして指定します。

データ型: double

名前と値の引数

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

例: grabcut(A,L,ROI,Connectivity=4)

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

例: grabcut(A,L,ROI,'Connectivity',4)

連結要素の連結性。次のいずれかの値として指定します。既定の連結性は 2 次元イメージでは 8、3 次元イメージでは 26 です。

意味

2 次元連結性

4

ピクセルのエッジの部分が接触している場合、ピクセルは連結されます。2 つの隣り合ったピクセルは両方とも "on" の場合に同じオブジェクトの一部であり、水平方向または垂直方向に連結します。

Center pixel connected to four pixels

現在のピクセルを灰色で示します。

8

ピクセルのエッジまたはコーナーが接触している場合、ピクセルは連結されます。2 つの隣り合ったピクセルは両方とも "on" の場合に同じオブジェクトの一部であり、水平方向、垂直方向または対角方向に連結します。

Center pixel connected to eight pixels

現在のピクセルを灰色で示します。

3 次元連結性

6

面が接触している場合、ピクセルは連結されます。2 つの隣り合ったピクセルは両方とも "on" の場合に同じオブジェクトの一部であり、次のように連結します。

  • 次のいずれかの方向: 奥、手前、左、右、上および下

Center pixel connected to the faces of 6 pixels

現在のピクセルは立方体の中心です。

18

面またはエッジが接触している場合、ピクセルは連結されます。2 つの隣り合ったピクセルは両方とも "on" の場合に同じオブジェクトの一部であり、次のように連結します。

  • 次のいずれかの方向: 奥、手前、左、右、上および下

  • 右下または上の奥など、2 つの方向の組み合わせ

Center pixel connected to the faces of 6 pixels and the edges of 12 pixels

現在のピクセルは立方体の中心です。

26

面、エッジまたはコーナーが接触している場合、ピクセルは連結されます。2 つの隣り合ったピクセルは両方とも "on" の場合に同じオブジェクトの一部であり、次のように連結します。

  • 次のいずれかの方向: 奥、手前、左、右、上および下

  • 右下または上の奥など、2 つの方向の組み合わせ

  • 右上の奥または左下の奥など、3 つの方向の組み合わせ

Center pixel connected to the faces of 6 pixels, the edges of 12 pixels, and the corners of 8 pixels

現在のピクセルは立方体の中心です。

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

このアルゴリズムで実行される最大反復回数。このアルゴリズムは、最大反復数に到達する前に解に収束する場合があります。

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

出力引数

すべて折りたたむ

セグメント化されたイメージ。ラベル行列 L と同じサイズのバイナリ イメージとして返されます。

ヒント

  • double および single イメージでは、grabcut はイメージの範囲を [0 1] と仮定します。イメージが uint16int16 および uint8 の場合、grabcut はイメージの範囲を、与えられたデータ型の全範囲と仮定します。

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

アルゴリズム

  • このアルゴリズムは ROI の外側に一部でもかかっている部分領域をすべて、背景に属するものとして扱います。最適なセグメンテーションを得るには、セグメント対象のオブジェクトが必ず、ROI に完全に含まれ、少数の背景ピクセルで囲まれるようにします。

  • ラベル行列の部分領域を、前景マスクと背景マスクの両方に所属するものとしてマークしないでください。ラベル行列の領域に前景マスクと背景マスクの両方に所属するピクセルが含まれる場合、アルゴリズムは領域をマークなしとして扱います。

  • このアルゴリズムは、関心領域の外側にある部分領域がすべて背景に属していることを前提としています。これらの部分領域のいずれかを、前景マスクまたは背景マスクに属するものとしても、結果のセグメンテーションに影響はありません。

参照

[1] Rother, C., V. Kolmogorov, and A. Blake. "GrabCut - Interactive Foreground Extraction using Iterated Graph Cuts". ACM Transactions on Graphics (SIGGRAPH). Vol. 23, Number 3, 2004, pp. 309–314.

拡張機能

バージョン履歴

R2018a で導入

すべて展開する