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

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

figure
imshow(RGB)
h1 = drawpolygon(gca,'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);
figure
imshow(BW)

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

maskedImage = RGB;
maskedImage(repmat(~BW,[1 1 3])) = 0;
figure;
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

名前と値のペアの引数

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

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

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

平均

2 次元連結性

4

4 連結近傍

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

8

8 連結近傍

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

3 次元連結性

6

6 連結近傍

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

18

18 連結近傍

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

26

26 連結近傍

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

データ型: 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 で導入