Main Content

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

この例では、テクスチャに基づいて領域を識別し、セグメント化する方法を示します。

イメージの読み取り

バッグのテクスチャ パターンのグレースケール イメージを読み取り、それを表示します。

I = imread('bag.png');
imshow(I)
title('Original Image')

テクスチャ イメージの作成

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

stdfilt および rangefilt を使用しても、同じようなセグメンテーション結果に達することができます。局所エントロピーのテクスチャ イメージを比較するため、局所的な標準偏差と局所範囲を示すテクスチャ イメージ S および R をそれぞれ作成します。

E = entropyfilt(I);
S = stdfilt(I,ones(9));
R = rangefilt(I,ones(9));

rescale を使用してテクスチャ イメージ E および S を再スケーリングし、ピクセル値がデータ型 double のイメージに期待される [0, 1] の範囲に収まるようにします。

Eim = rescale(E);
Sim = rescale(S);

3 つのテクスチャ イメージをモンタージュに表示します。

montage({Eim,Sim,R},'Size',[1 3],'BackgroundColor','w',"BorderSize",20)
title('Texture Images Showing Local Entropy, Local Standard Deviation, and Local Range')

下部テクスチャでのマスクの作成

この例では、引き続きエントロピー テクスチャ イメージ Eim を処理します。その他のモルフォロジー関数を使用して、他の 2 種類のテクスチャ イメージについて同様の処理を繰り返しても、同じようなセグメンテーション結果に達することができます。

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

BW1 = imbinarize(Eim,0.8);
imshow(BW1)
title('Thresholded Texture Image')

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

BWao = bwareaopen(BW1,2000);
imshow(BWao)
title('Area-Opened Texture Image')

関数 imclose を使用して、エッジを滑らかにし、BWao のオブジェクトで開いている穴を閉じます。entropyfilt で使用したものと同じ 9 行 9 列近傍を指定します。

nhood = ones(9);
closeBWao = imclose(BWao,nhood);
imshow(closeBWao)
title('Closed Texture Image')

関数 imfill を使用して、closeBWao のオブジェクトの穴を塗りつぶします。マスクはイメージの最下部まで拡張されていないため、下部テクスチャのマスクは完ぺきではありません。ただし、マスクを使用して、テクスチャをセグメント化できます。

mask = imfill(closeBWao,'holes');
imshow(mask);
title('Mask of Bottom Texture')

マスクを使用したテクスチャのセグメント化

テクスチャを 2 つの異なるイメージに分割します。

textureTop = I;
textureTop(mask) = 0;
textureBottom = I;
textureBottom(~mask) = 0;
montage({textureTop,textureBottom},'Size',[1 2],'BackgroundColor','w',"BorderSize",20)
title('Segmented Top Texture (Left) and Segmented Bottom Texture (Right)')

セグメンテーション結果の表示

ラベル行列を作成し、ラベル 1 のマスクを false、ラベル 2 のマスクを true とします。元のイメージ上にラベル行列を重ね合わせます。

L = mask+1;
imshow(labeloverlay(I,L))
title('Labeled Segmentation Regions')

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

boundary = bwperim(mask);
imshow(labeloverlay(I,boundary,"Colormap",[0 1 1]))
title('Boundary Between Textures')

参考

| | | | | |