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(I, 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);
shading interp
colormap("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
lighting phong

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 内の前景領域 (logical 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 の背景 (logical 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 で導入

すべて展開する