Main Content

imsegfmm

高速マーチング法を使用したバイナリ イメージのセグメンテーション

説明

BW= imsegfmm(W,mask,thresh)は高速マーチング法を使用して計算された、セグメント化されたイメージBWを返します。配列Wは各ピクセルの重みを指定します。maskはシード位置を指定する logical 配列です。threshはしきい値レベルを指定します。

BW= imsegfmm(W,C,R,thresh)はセグメント化されたイメージを返します。このとき、行インデックスと列インデックスが格納されたベクトルCRでシード位置を指定します。CRにはW内の有効なピクセル インデックスを値として格納しなければなりません。

BW= imsegfmm(W,C,R,P,thresh)はセグメント化されたイメージを返します。このとき、列インデックス、行インデックス、および平面インデックスが格納されたベクトルCR、およびPでシード位置を指定します。CR、およびPにはW内の有効なピクセル インデックスを値として格納しなければなりません。

[BW,D] = imsegfmm(___)は高速マーチング法を使用して計算された正規化後の測地線距離マップDを返します。BWDをしきい値処理したバージョンで、正規化後の測地線距離値がthresh未満であるすべてのピクセルが前景ピクセルと見なされてtrueに設定されています。さまざまなレベルでDをしきい値処理すると、異なるセグメンテーション結果が得られます。

すべて折りたたむ

この例では、高速マーチング法により、シード位置とのグレースケール強度の差に基づいてイメージ内のオブジェクトをセグメント化する方法を説明します。

イメージを読み取ります。

I = imread('cameraman.tif'); imshow(I) title('Original Image')

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

マスクを作成し、シード位置を指定します。roipolyを使用してマスクを対話的に作成することもできます。

mask = false(size(I)); mask(170,70) = true;

グレースケール強度の差に基づいて重み配列を計算します。

W = graydiffweight(我mask,'GrayDifferenceCutoff', 25);

重みを使用してイメージをセグメント化します。

thresh = 0.01; [BW, D] = imsegfmm(W, mask, thresh); figure imshow(BW) title('Segmented Image')

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

さまざまなしきい値を使用して測地線距離行列Dをしきい値処理すると、異なるセグメンテーション結果が得られます。

figure imshow(D) title('Geodesic Distances')

Figure contains an axes object. The axes object with title Geodesic Distances contains an object of type image.

この例では、人体頭部の MRI データから脳をセグメント化します。

MRI データを読み込みます。

load("mri") V = squeeze(D);

データを可視化します。

sizeO = size(V); figure slice(double(V),sizeO(2)/2,sizeO(1)/2,sizeO(3)/2); shadinginterpcolormap("gray") title("Original")

Figure contains an axes object. The axes object with title Original contains 3 objects of type surface.

シード位置を設定します。

seedR = 75; seedC = 60; seedP = 10;

グレースケール強度の差に基づいて重みを計算します。

W = graydiffweight(V,seedC,seedR,seedP,"GrayDifferenceCutoff",25);

重みを使用してイメージをセグメント化します。

thresh = 0.002; BW = imsegfmm(W,seedC,seedR,seedP,thresh);

等値面を使用して、セグメント化されたイメージを可視化します。

figure p = patch(isosurface(double(BW))); p.FaceColor ="red"; p.EdgeColor ="none"; daspect([1 1 27/64]); camlight lightingphong

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

入力引数

すべて折りたたむ

重み配列。非負の数値配列として指定します。関数graydiffweightまたはgradientweightを使用することで、重み配列を計算できます。Wの大きい値は前景 (オブジェクト) を識別し、小さい値は背景を識別します。

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

シード位置マスク。Wと同じサイズの logical 配列として指定します。masktrueである位置はシード位置です。graydiffweightを使用して重み行列Wを作成する場合は、imsegfmmで使用したのと同じmaskの値をgraydiffweightでも使用することを推奨します。

データ型:logical

バイナリ イメージの取得に使用するしきい値レベル。[0, 1] の範囲の数値として指定します。通常、低い値を指定するとBW内の前景領域 (論理値 true) が大きくなり、高い値を指定すると前景領域が小さくなります。

例:0.5

データ型:double

参照ピクセルの列インデックス。数値ベクトルとして指定します。

例:[50 75 93]

データ型:double

参照ピクセルの行インデックス。数値ベクトルとして指定します。

例:[48 71 89]

データ型:double

参照ピクセルの平面インデックス。数値ベクトルとして指定します。

例:[2 4 7]

データ型:double

出力引数

すべて折りたたむ

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

データ型:logical

正規化された測地線距離マップ。Wと同じサイズの数値配列として返されます。Wsingleクラスの場合は、Dsingleクラスになります。それ以外の場合、Dはクラスdoubleです。

データ型:double|single

ヒント

  • imsegfmmは、singleクラスを除くすべてのクラスの内部計算に、倍精度浮動小数点演算を使用します。Wsingleクラスの場合には、imsegfmmは内部的に単精度浮動小数点演算を使用します。

  • 測地線距離イメージDでは、imsegfmmは重み値が0またはNaNのピクセルをInfに設定します。これらのピクセルは、セグメント化されたイメージBWの背景 (論理値 false) に含まれます。

参照

[1] Sethian, J. A. Level Set Methods and Fast Marching Methods: Evolving Interfaces in Computational Geometry, Fluid Mechanics, Computer Vision, and Materials Science, Cambridge University Press, 2nd Edition, 1999.

バージョン履歴

R2014b で導入