Main Content

imseggeodesic

測地線距離ベースの色のセグメンテーションを使用したイメージの 2 または 3 領域へのセグメント化

説明

L = imseggeodesic(RGB,BW1,BW2) は、カラー イメージ RGB をセグメント化し、ラベルを使用してセグメント化されたバイナリ イメージ L を返します。BW1 および BW2 は、2 つの領域 (前景と背景) の "スクリブル" と呼ばれる初期シード領域の位置を指定するバイナリ イメージです。

imseggeodesic は、BW1BW2 に指定されたスクリブルを、セグメンテーションで使用する各領域の統計量の計算に代表サンプルとして使用します。BW1BW2で指定されるスクリブル (logical true の領域) はオーバーラップしないようにします。基礎となるアルゴリズムは、セグメンテーション用のスクリブルでマークされた領域に関して推定した統計量を使用します。スクリブルでマークするピクセルの数を大きくすると、領域の統計量をより正確に推定でき、一般的にセグメンテーションの精度がより高くなります。そのため、可能な限り多くのスクリブルを指定することをお勧めします。通常は、領域ごとに最小で数百個のピクセルをスクリブルとして指定します。

L = imseggeodesic(RGB,BW1,BW2,BW3) は、カラー イメージ RGB をセグメント化し、3 つのセグメントを持つセグメント化されたイメージを返します (3 値セグメンテーション)。領域ラベルはラベル行列 L で指定されます。BW1BW2 および BW3 は、3 つの領域の初期シード領域またはスクリブルの位置を指定するバイナリ イメージです。BW1BW2、および BW3 で指定されるスクリブル (logical の true の領域) はオーバーラップしないようにします。

また、L = imseggeodesic(___,"AdaptiveChanneWeighting",tf) は、関数 imseggeodesic が適応チャネル重み付けを使用してセグメンテーションを実行するかも指定します。tftrue として指定されている場合、imseggeodesic は適応チャネル重み付けを使用します。既定の設定では、tf の値は false で、imseggeodesic はすべてのチャネルを均等に重み付けします。

[L,P] = imseggeodesic(___) は、行列 P の各ラベルに各ピクセルが属する確率も返します。

すべて折りたたむ

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

RGB = imread('yellowlily.jpg');
imshow(RGB)

目標は花びらをセグメント化することです。関数 drawrectangle を使用して、初期シード領域を四角形 ROI として指定します。この ROI を赤で表示します。名前と値のペアの引数 'Position' は、ROI の左上の座標、幅、高さを 4 要素ベクトル [xmin, ymin, width, height] として指定します。四角形を対話的に描画する場合は、名前と値のペアの引数 'Position' を省略します。

roiObject = drawrectangle(gca,'Position',[350 700 375 120],'Color','r');

背景の初期シード領域を四角形 ROI として指定します。この ROI を青で表示します。

roiBackground = drawrectangle(gca,'Position',[90 1230 910 190],'Color','b');

ROI ごとにマスクを作成します。このマスクでは、ROI を true とし、その他のピクセルを false とします。

maskObject = createMask(roiObject);
maskBackground = createMask(roiBackground);

イメージをセグメント化します。

[L,P] = imseggeodesic(RGB,maskObject,maskBackground);

セグメント化されたラベルを表示します。

imshow(label2rgb(L))
title('Segmented Labels')

元のイメージの上に、セグメント化されたラベルを表示します。

imshow(labeloverlay(RGB,L))
title('Labels Overlaid on Original Image')

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

RGB = imread('yellowlily.jpg'); 
imshow(RGB)

最初の領域は黄色の花びらで構成されています。関数 drawrectangle を使用して、初期シード領域を四角形 ROI として指定します。この ROI を黄色で描画します。名前と値のペアの引数 'Position' は、ROI の左上の座標、幅、高さを 4 要素ベクトル [xmin, ymin, width, height] として指定します。四角形を対話的に描画する場合は、名前と値のペアの引数 'Position' を省略します。

r1 = drawrectangle(gca,'Position',[350 700 425 120],'Color','y');

2 番目の領域は、緑色の葉で構成されています。シード領域を四角形 ROI として指定し、その ROI を赤で描画します。

r2 = drawrectangle(gca,'Position',[800 1124 120 230],'Color','r');

3 番目の領域は背景であり、このイメージでは土です。シード領域を四角形 ROI として指定し、その ROI を青で描画します。

r3 = drawrectangle(gca,'Position',[1010 290 180 240],'Color','b');

ROI ごとにマスクを作成します。このマスクでは、ROI を true とし、その他のピクセルを false とします。

mask1 = createMask(r1);
mask2 = createMask(r2);
mask3 = createMask(r3);

イメージをセグメント化します。

[L,P] = imseggeodesic(RGB,mask1,mask2,mask3,'AdaptiveChannelWeighting',true);

元のイメージの上に、セグメント化されたラベルを表示します。

imshow(labeloverlay(RGB,L))
title('Segmented Image with Three Regions')

イメージの右下隅は領域 2 (葉) に誤分類されています。別の背景 ROI を追加します。

r4 = drawrectangle(gca,'Position',[20 1320 480 200],'Color','b');

mask4 = createMask(r4);
maskBackground = mask3 + mask4;

イメージをセグメント化し、元のイメージの上に、セグメント化されたラベルを表示します。

[L,P] = imseggeodesic(RGB,mask1,mask2,maskBackground,'AdaptiveChannelWeighting',true);
imshow(labeloverlay(RGB,L))
title('Refined Segmented Image with Three Regions')

各ピクセルが各ラベルに属する確率を表示します。

montage(P,'Size',[1 3])
title('Probability That Each Pixel Belongs to Each Label')

入力引数

すべて折りたたむ

セグメント化するイメージ。RGB イメージとして指定します。imseggeodesic は入力 RGB イメージを YCbCr 色空間に変換してからセグメンテーションを実行します。

データ型: double | uint8 | uint16

最初の領域のスクリブル イメージ。logical 行列として指定します。BW1 は行数と列数が入力イメージ RGB と同じでなければなりません。スクリブルを対話的に作成するには、まず関数 drawcircledrawfreehanddrawpolygondrawrectangle などを使用して ROI を描画します。次に、関数 createMask を使用して、ROI からマスクを作成します。

データ型: logical

2 番目の領域のスクリブル イメージ。logical 行列として指定します。BW2 は行数と列数が入力イメージ RGB と同じでなければなりません。スクリブルを対話的に作成するには、まず関数 drawcircledrawfreehanddrawpolygondrawrectangle などを使用して ROI を描画します。次に、関数 createMask を使用して、ROI からマスクを作成します。

データ型: logical

3 番目の領域のスクリブル イメージ。logical 行列として指定します。BW3 は行数と列数が入力イメージ RGB と同じでなければなりません。スクリブルを対話的に作成するには、まず関数 drawcircledrawfreehanddrawpolygondrawrectangle などを使用して ROI を描画します。次に、関数 createMask を使用して、ROI からマスクを作成します。

データ型: logical

適応チャネル重み付けの使用。数値または logical の 0 (false) または 1 (true) として指定します。true の場合、imseggeodesic は、入力として指定されたスクリブルに基づき、セグメンテーションに有用な識別情報の保有量に応じてチャネルを重み付けします。false (既定の設定) の場合、imseggeodesic はすべてのチャネルを均等に重み付けします。

データ型: logical

出力引数

すべて折りたたむ

ラベル行列。非負の整数の行列として返されます。0 のラベルが付いたピクセルは背景となり、1 のラベルが付いたピクセルによりセグメント化された領域が識別されます。3 値セグメンテーションでは、2 のラベルが付いたピクセルにより、もう 1 つのセグメント化された領域が識別されます。

データ型: double

ピクセルがラベル付き領域に属する確率。2 値セグメンテーションでは M x N x 2 の行列、3 値セグメンテーションでは M x N x 3 の行列として指定します。M と N は入力イメージの行数と列数です。P(i,j,k)(i,j) の位置にあるピクセルがラベル k に属する確率を指定します。

データ型: double

ヒント

  • 2つ (または 3 つ) の領域のスクリブルは互いにオーバーラップしないようにします。各スクリブル行列 (BW1BW2 および BW3) は空にしないでください。すなわち、それぞれのスクリブルに論理値 true としてマークされるピクセルが少なくとも 1 つ (できればそれ以上) 存在しなければなりません。

アルゴリズム

imseggeodesic は、測地線距離ベースの色のセグメンテーション アルゴリズムを使用します ([1] と同様)。

参照

[1] A. Protiere and G. Sapiro, Interactive Image Segmentation via Adaptive Weighted Distances, IEEE Transactions on Image Processing. Volume 16, Issue 4, 2007.

バージョン履歴

R2015a で導入