Main Content

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

lazysnapping

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

説明

BW = lazysnapping(A,L,foremask,backmask) は、レイジー スナッピングを使用して、イメージ A を前景と背景の領域にセグメント化します。ラベル行列 L はイメージの部分領域を指定します。foremaskbackmask はイメージ内のピクセルを前景および背景としてそれぞれ指定するマスクです。

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

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

すべて折りたたむ

イメージを読み取って表示します。

RGB = imread('peppers.png');
imshow(RGB)

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

L = superpixels(RGB,500);

関数 drawrectangle を使用して、前景内に四角形 ROI を指定します。名前と値のペアの引数 'Position' は、ROI の左上の座標、幅、高さを 4 要素ベクトル [xmin,ymin,width,height] として指定します。四角形を対話的に描画する場合は、名前と値のペアの引数 'Position' を省略します。

f = drawrectangle(gca,'Position',[100 128 350 150],'Color','g');

前景ピクセルをもつマスクを作成します。

foreground = createMask(f,RGB);

背景 ROI を指定します。セグメンテーションの精度を向上させるため、この例では 2 つの四角形 ROI を背景の別々の領域に指定します。

b1 = drawrectangle(gca,'Position',[130 30 40 30],'Color','r');
b2 = drawrectangle(gca,'Position',[6 368 500 10],'Color','r');

背景ピクセルをもつマスクを作成します。このマスクは、2 つの背景 ROI の和集合です。

background = createMask(b1,RGB) + createMask(b2,RGB);

レイジー スナッピングを実行します。

BW = lazysnapping(RGB,L,foreground,background);

前景を緑で強調表示することで、セグメンテーションの結果を可視化します。

imshow(labeloverlay(RGB,BW,'Colormap',[0 1 0]))

背景が黒い、マスクされたイメージを作成します。

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

イメージを読み取って表示します。

RGB = imread('peppers.png');
imshow(RGB)

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

L = superpixels(RGB,500);

前景のピクセルの x 座標と y 座標を指定します。

foregroundX = [34 114 195 259 392 467 483];
foregroundY = [298 140 135 200 205 283 104];

座標を線形インデックスに変換します。sub2ind は (行, 列) 座標を取るため、入力引数は y 座標を x 座標の前にして指定します。

foregroundInd = sub2ind(size(RGB),foregroundY,foregroundX);

背景のピクセルの x 座標と y 座標を指定します。

backgroundX = [130 170];
backgroundY = [52 32];

座標を線形インデックスに変換します。

backgroundInd = sub2ind(size(RGB),backgroundY,backgroundX);

レイジー スナッピングを実行します。

BW = lazysnapping(RGB,L,foregroundInd,backgroundInd);

セグメント化されたマスクを表示します。前景ピクセルは true で、背景ピクセルは false です。

imshow(BW)

マスクを元のイメージの上に重ねて表示し、前景ピクセルを緑で強調表示します。

imshow(labeloverlay(RGB,BW,'Colormap',[0 1 0]))

3 次元ボリューム イメージをワークスペースに読み込みます。

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

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

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

 figure; 
 imshow(bseed)

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

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

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

 L = superpixels3(V,500);

レイジー スナッピングを使用して、イメージを前景と背景にセグメント化します。

bw = lazysnapping(V,L,fmask,bmask);

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

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

入力引数

すべて折りたたむ

セグメント化するイメージ。2 次元のグレースケール イメージ、トゥルーカラー イメージ、マルチスペクトル イメージ、または 3 次元のグレースケール ボリュームとして指定します。double および single イメージでは、lazysnapping はイメージの範囲を [0, 1] と仮定します。イメージが uint16int16 および uint8 の場合、lazysnapping はイメージの範囲を、与えられたデータ型の全範囲と仮定します。データ型に基づいて想定される範囲に値が適合していない場合、イメージを想定される範囲にスケーリングするか、EdgeWeightScaleFactor を調整して、結果を改善します。

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

入力イメージまたはボリュームのラベル行列。数値配列として指定します。2 次元グレースケール イメージおよび 3 次元グレースケール ボリュームの場合、L のサイズは入力イメージ A のサイズと同じでなければなりません。カラー イメージおよびマルチチャネル イメージの場合、L は 2 次元配列で、最初の 2 次元が入力イメージ A の最初の 2 次元と同じでければなりません。

ラベル行列の任意の部分領域を、前景マスクと背景マスクの両方に所属するものとしてマークしないでください。ラベル行列の領域に前景マスクと背景マスクの両方に所属するピクセルが含まれる場合、lazysnapping は領域を背景にセグメント化します。

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

前景を定義するマスク イメージ。logical 配列として指定します。2 次元グレースケール イメージおよび 3 次元グレースケール ボリュームの場合、foremask のサイズは入力イメージ A のサイズと同じでなければなりません。カラー イメージおよびマルチチャネル イメージの場合、foremask は 2 次元配列で、最初の 2 次元が入力イメージ A の最初の 2 次元と同じでければなりません。

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

背景を定義するマスク イメージ。logical 配列として指定します。2 次元グレースケール イメージおよび 3 次元グレースケール ボリュームの場合、backmask のサイズは入力イメージ A のサイズと同じでなければなりません。カラー イメージおよびマルチチャネル イメージの場合、backmask は 2 次元配列で、最初の 2 次元が入力イメージ A の最初の 2 次元と同じでければなりません。

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

ラベル行列内のピクセルの線形インデックス。数値ベクトルとして指定します。

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

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

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

名前と値のペアの引数

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

例: 'Connectivity',6

連結要素の連結性。'Connectivity' と次のいずれかで構成されるコンマ区切りのペアとして指定します。2 次元イメージの場合は 4 または 8。3 次元イメージ (ボリューム) の場合は 6、18、または 26。

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

ラベル行列の部分領域間のエッジの重みに対する倍率。'EdgeWeightScaleFactor' と正の数値から構成されるコンマ区切りのペアとして指定します。典型的な値の範囲は [10, 1000] です。この値を大きくすると、lazysnapping では近傍の部分領域が前景または背景としてまとめてラベル付けされる可能性が高くなります。

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

出力引数

すべて折りたたむ

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

データ型: logical

ヒント

  • Li らによって開発されたレイジー スナッピング アルゴリズムは、前景と背景の値を K-means 法でクラスター化します。ここでのレイジー スナッピング アルゴリズムの実装には、類似の前景ピクセルや背景ピクセルのクラスター化は含まれません。パフォーマンスを向上させるために、前景または背景として識別される類似値のピクセルの数を削減してください。

  • マスク foremask または backmask を対話的に取得するには、イメージ上に ROI を描画し、次に関数 createMask を使用して、その ROI からマスクを作成します。詳細は、ROI 作成の概要 を参照してください。

  • ピクセル インデックス foreind または backind を対話的に取得するには、関数 drawpolyline を使用して、Polyline ROI オブジェクトを描画します。頂点の x 座標と y 座標を PolylinePosition プロパティから取得します。最後に、関数 sub2ind を使用して、座標を線形インデックスに変換します。関数 sub2ind は (x, y) 座標の代わりに (row, column) 座標を使用する点に注意してください。

参照

[1] Y. Li, S. Jian, C. Tang, H. Shum, Lazy Snapping In Proceedings from the 31st International Conference on Computer Graphics and Interactive Techniques, 2004.

R2017a で導入