ドキュメンテーション

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

テクスチャ フィルターを使ったテクスチャのセグメンテーション

この例では、テクスチャに基づいて領域を識別するためにテクスチャのセグメンテーションを使用する方法を示します。目的は、テクスチャ フィルターを使ってイメージ内の 2 種類の布地をセグメント化することです。

手順 1: イメージの読み取り

bag.png を読み取ります。

I = imread('bag.png');
figure
imshow(I)

手順 2: テクスチャ イメージの作成

関数 entropyfilt を使用して、テクスチャ イメージを作成します。関数 entropyfilt は、配列を出力します。ここで、各出力ピクセルは、入力イメージ I 内の対応するピクセル周辺に 9x9 近傍のエントロピー値を含んでいます。エントロピーとは、ランダム性の統計的尺度です。

E = entropyfilt(I);

値が double イメージの既定の範囲内にあるように、関数 rescale を使用して、テクスチャ イメージ E を再スケーリングします。

Eim = rescale(E);
figure
imshow(Eim)

手順 3: 下部テクスチャでの粗いマスクの作成

再スケーリングされたイメージ Eim をしきい値処理し、テクスチャをセグメント化します。テクスチャ間の境界線のピクセル強度値とほとんど同じであるため、しきい値 0.8 を選択します。

BW1 = imbinarize(Eim, .8);
imshow(BW1);

figure
imshow(I)

バイナリ イメージ BW1 のセグメント化されたオブジェクトは白色です。BW1I を比較した場合、上部テクスチャは過度にセグメント化され (複数の白色オブジェクト)、下部テクスチャはほとんど全体がセグメント化されていることに気が付きます。関数 bwareaopen を使用して下部テクスチャを抽出できます。

BWao = bwareaopen(BW1,2000);
imshow(BWao)

関数 imclose を使用して、エッジを滑らかにし、BWao のオブジェクトで開いている穴を閉じます。9x9 近傍を選択します。これは entropyfilt によっても使用されたためです。

nhood = true(9);
closeBWao = imclose(BWao,nhood);
imshow(closeBWao)

関数 imfill を使用して、closeBWao のオブジェクトの穴を塗りつぶします。

roughMask = imfill(closeBWao,'holes');

手順 4: 粗いマスクを使用した上部テクスチャのセグメント化

バイナリ イメージ roughMask と元のイメージ I を比較します。マスクはイメージの最下部まで拡張されていないため、下部テクスチャのマスクは完ぺきではないことに注意してください。ただし、関数 roughMask を使用して、上部テクスチャをセグメント化できます。

imshow(roughMask);

figure
imshow(I)

関数 roughMask を使用して上部テクスチャの生イメージを取得します。

I2 = I;
I2(roughMask) = 0;
imshow(I2)

関数 entropyfilt を使用して、テクスチャ イメージを計算します。

E2 = entropyfilt(I2);
E2im = rescale(E2);
imshow(E2im)

グローバルしきい値を使用して E2im をしきい値処理します。

BW2 = imbinarize(E2im);
imshow(BW2)

figure, imshow(I);

BW2I を比較すると、BW2 にはセグメント化されたオブジェクトが 2 つあることに気が付きます。関数 bwareaopen を使用して、上部テクスチャにマスクを取得します。

mask2 = bwareaopen(BW2,1000);
imshow(mask2)

手順 5: セグメンテーション結果の表示

mask2 を使用して、I から上部および下部テクスチャを抽出します。

texture1 = I;
texture1(~mask2) = 0;
texture2 = I;
texture2(mask2) = 0;
imshow(texture1)

figure
imshow(texture2)

2 つのテクスチャ間の境界線の輪郭を表示します。

boundary = bwperim(mask2);
segmentResults = I;
segmentResults(boundary) = 255;
imshow(segmentResults)

セグメンテーションでの他のテクスチャ フィルターの使用

関数 entropyfilt の代わりに、関数 stdfilt および rangefilt を他のモルフォロジー関数と併用しても、同じようなセグメンテーション結果に達することができます。

S = stdfilt(I,nhood);
imshow(rescale(S))

R = rangefilt(I,ones(5));
imshow(R)

参考

| | | | | |