このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,テクスチャに基づいて領域を識別し,セグメント化する方法を示します。
バッグのテクスチャパターンのグレースケールイメージを読み取り,それを表示します。
我= imread (“bag.png”);imshow (I)标题(原始图像的)
関数entropyfilt
を使用して,テクスチャイメージを作成します。関数entropyfilt
は,配列を出力します。ここで,各出力ピクセルは,入力イメージ我
内の対応するピクセル周辺に9 x9近傍のエントロピー値を含んでいます。エントロピーとは,ランダム性の統計的尺度です。
stdfilt
およびrangefilt
を使用しても,同じようなセグメンテーション結果に達することができます。局所エントロピーのテクスチャイメージを比較するため,局所的な標準偏差と局所範囲を示すテクスチャイメージ年代
およびR
をそれぞれ作成します。
E = entropyfilt(我);S = stdfilt(我的(9));R = rangefilt(我的(9));
重新调节
を使用してテクスチャイメージE
および年代
を再スケーリングし,ピクセル値がデータ型双
のイメージに期待される[0,1]の範囲に収まるようにします。
Eim =重新调节(E);Sim =重新调节(年代);
3つのテクスチャイメージをモンタージュに表示します。
蒙太奇({Eim, Sim, R},“大小”3 [1],“写成BackgroundColor”,' w ',“BorderSize”, 20)标题(“显示局部熵、局部标准差和局部范围的纹理图像”)
この例では,引き続きエントロピーテクスチャイメージEim
を処理します。その他のモルフォロジー関数を使用して,他の2種類のテクスチャイメージについて同様の処理を繰り返しても,同じようなセグメンテーション結果に達することができます。
再スケーリングされたイメージEim
をしきい値処理し,テクスチャをセグメント化します。テクスチャ間の境界線のピクセル強度値とほとんど同じであるため,しきい値0.8を選択します。
0.8 BW1 = imbinarize (Eim);imshow (BW1)标题(阈值纹理图像的)
バイナリイメージBW1
のセグメント化されたオブジェクトは白色です。BW1
と我
を比較した場合,上部テクスチャは過度にセグメント化され(複数の白色オブジェクト),下部テクスチャはほとんど全体がセグメント化されていることに気が付きます。bwareaopen
を使用して,上部テクスチャ内のオブジェクトを削除します。
BWao = bwareaopen (BW1, 2000);imshow (BWao)标题(“Area-Opened纹理图像”)
関数imclose
を使用して,エッジを滑らかにし,BWao
のオブジェクトで開いている穴を閉じます。entropyfilt
で使用したものと同じ9行9列近傍を指定します。
nhood = 1 (9);closeBWao = imclose (BWao nhood);imshow (closeBWao)标题(封闭的纹理图像的)
関数imfill
を使用して,closeBWao
のオブジェクトの穴を塗りつぶします。マスクはイメージの最下部まで拡張されていないため,下部テクスチャのマスクは完ぺきではありません。ただし,マスクを使用して,テクスチャをセグメント化できます。
掩码= imfill (closeBWao,“黑洞”);imshow(面具);标题(“底部纹理蒙版”)
テクスチャを2つの異なるイメージに分割します。
textureTop =我;textureTop(面具)= 0;textureBottom =我;textureBottom面具(~)= 0;蒙太奇({textureTop textureBottom},“大小”(1 - 2),“写成BackgroundColor”,' w ',“BorderSize”, 20)标题(“分割顶部纹理(左)和分割底部纹理(右)”)
ラベル行列を作成し,ラベル1のマスクを假
2,ラベルのマスクを真正的
とします。元のイメージ上にラベル行列を重ね合わせます。
L =面具+ 1;L) imshow (labeloverlay(我)标题(“标签分割区域”)
2つのテクスチャ間の境界線の輪郭をシアンで表示します。
边界= bwperim(面具);imshow (labeloverlay(边界,我“Colormap”,[0 1 1])) title(“纹理之间的界限”)
entropyfilt
|bwareaopen
|imclose
|imbinarize
|imfill
|bwperim
|rangefilt