Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

マーカー コントロール付き watershed セグメント化

この例では、watershed セグメント化を使用してイメージ内で接触しているオブジェクトを分離する方法を示します。Watershed 変換は、明るいピクセルを高い表面、暗いピクセルを低い表面として扱うことにより、イメージ内の "集水域 (catchment basins)" と "流域の稜線 (watershed ridge lines)" を検出します。

前面のオブジェクトと背景の位置を識別、あるいは "印付け" することができる場合、Watershed 変換を使ったセグメンテーションはうまく機能します。マーカーをコントロールした watershed セグメント化は、以下の手順になります。

  1. セグメンテーション関数を計算します。これは、暗い領域をセグメント化しようとするオブジェクトのイメージです。

  2. 前景のマーカーを計算します。これらは、各オブジェクト内のピクセルの連結された粒子です。

  3. 背景のマーカーを計算します。これらは、任意のオブジェクトの一部ではないピクセルです。

  4. 前景と背景のマーカーの位置が最小となるようにセグメンテーション関数を修正します。

  5. 修正したセグメンテーション関数の Watershed 変換を計算します。

手順 1: カラー イメージの読み取りとグレースケールへの変換

rgb = imread("pears.png");
I = im2gray(rgb);
imshow(I)

text(732,501,"Image courtesy of Corel(R)",...
     "FontSize",7,"HorizontalAlignment","right")

手順 2: 勾配の大きさをセグメンテーション関数として使用

勾配の大きさを計算します。勾配はオブジェクトの境界線で高く、オブジェクトの内部で低くなります (ほとんどの場合)。

gmag = imgradient(I);
imshow(gmag,[])
title("Gradient Magnitude")

勾配振幅で watershed 変換を直接使用することにより、イメージをセグメント化できますか?

L = watershed(gmag);
Lrgb = label2rgb(L);
imshow(Lrgb)
title("Watershed Transform of Gradient Magnitude")

いいえ。以下のマーカー計算などの追加の事前処理なしでは、watershed 変換を直接使用すると、結果は "オーバーセグメンテーション" となります。

手順 3: 前景オブジェクトのマーク付け

さまざまな手順をここに適用して前景のマーカーを検出します。これは各前景オブジェクト内のピクセルの連結された粒子でなければなりません。この例では、"opening-by-reconstruction" および "closing-by-reconstruction" と呼ばれるモルフォロジー技術を使用して、イメージを "消去" します。これらの操作は、imregionalmax を使用して配置できる各オブジェクト内のフラット最大値を作成します。

オープニングは、収縮の後に膨張を行ないますが、opening-by-reconstruction は収縮の後にモルフォロジー再構成を行います。この 2 つを比較します。まず、imopen を使用してオープニングを計算します。

se = strel("disk",20);
Io = imopen(I,se);
imshow(Io)
title("Opening")

次に imerode および imreconstruct を使用して opening-by-reconstruction を計算します。

Ie = imerode(I,se);
Iobr = imreconstruct(Ie,I);
imshow(Iobr)
title("Opening-by-Reconstruction")

オープニングの後でクロージングをすると、暗斑およびステム マークを削除できます。通常のモルフォロジー クロージングと closing-by-reconstruction を比較します。最初に imclose を試行します。

Ioc = imclose(Io,se);
imshow(Ioc)
title("Opening-Closing")

そして、imdilate を使用し、その後 imreconstruct を使用します。imreconstruct のイメージ入力と出力を補足しなければならないことに注意してください。

Iobrd = imdilate(Iobr,se);
Iobrcbr = imreconstruct(imcomplement(Iobrd),imcomplement(Iobr));
Iobrcbr = imcomplement(Iobrcbr);
imshow(Iobrcbr)
title("Opening-Closing by Reconstruction")

IobrcbrIoc を比較すると、オブジェクトの全体の形状に影響を与えずに小さな傷を削除する際、再構成ベースのオープニングおよびクロージングが標準のオープニングおよびクロージングよりも効率的であることがわかります。Iobrcbr の局所的最大値を計算して、適切な前景のマーカーを取得します。

fgm = imregionalmax(Iobrcbr);
imshow(fgm)
title("Regional Maxima of Opening-Closing by Reconstruction")

結果を解釈するには、前景マーカー イメージを元のイメージに重ね合わせます。

I2 = labeloverlay(I,fgm);
imshow(I2)
title("Regional Maxima Superimposed on Original Image")

最も隠れて影になったオブジェクトのいくつかはマークされていません。これらのオブジェクトが、最終結果で適切にセグメント化されないということです。また、オブジェクトの前景マーカーがオブジェクトのエッジにまで到達しています。マーカー粒子のエッジをきれいにし、縮小する必要があります。これは、クロージングの後に収縮を行うことによって実行できます。

se2 = strel(ones(5,5));
fgm2 = imclose(fgm,se2);
fgm3 = imerode(fgm2,se2);

この手順は、削除されなければならない散在して孤立したピクセルを残す可能性があります。関数 bwareaopen を使用することにより、一定数のピクセルより少ないすべての粒子を削除できます。

fgm4 = bwareaopen(fgm3,20);
I3 = labeloverlay(I,fgm4);
imshow(I3)
title("Modified Regional Maxima Superimposed on Original Image")

手順 4: 背景マーカーの計算

ここで、背景にマークを付ける必要があります。クリーンアップされたイメージ Iobrcbr では、暗い色のピクセルは背景に属するため、しきい値処理から開始できます。

bw = imbinarize(Iobrcbr);
imshow(bw)
title("Thresholded Opening-Closing by Reconstruction")

背景ピクセルは黒色ですが、背景マーカーがセグメント化するオブジェクトのエッジに近すぎないことが理想です。bw の前景の "skeleton by influence zones" すなわち SKIZ を計算することにより、背景を "希薄" にします。これは、bw の距離変換の watershed 変換を計算し、結果の流域の稜線 (DL == 0) を探すことにより、実行できます。

D = bwdist(bw);
DL = watershed(D);
bgm = DL == 0;
imshow(bgm)
title("Watershed Ridge Lines")

手順 5: セグメンテーション関数の watershed 変換の計算

関数 imimposemin は、イメージが特定の場所にのみ局所的最小値をもつように、イメージを変更するために使用できます。ここで、関数 imimposemin を使用して、局所的最小値のみが前景と背景マーカー ピクセルで発生するように、勾配振幅イメージを変更します。

gmag2 = imimposemin(gmag, bgm | fgm4);

最後に、watershed ベースのセグメント化を計算します。

L = watershed(gmag2);

手順 6: 結果の可視化

可視化の手法の 1 つは、前景マーカー、背景マーカー、およびセグメント化されたオブジェクトの境界線を元のイメージに重ね合わせる手法です。必要に応じて膨張を使用し、オブジェクトの境界など特定の局面をより明確にします。オブジェクトの境界線は L == 0 にあります。前景および背景バイナリ マーカーは、異なるラベルが割り当てられるように別々の整数値にスケーリングされます。

labels = imdilate(L==0,ones(3,3)) + 2*bgm + 3*fgm4;
I4 = labeloverlay(I,labels);
imshow(I4)
title("Markers and Object Boundaries Superimposed on Original Image")

この可視化は、前景および背景マーカーの場所が結果に与える影響を示します。いくつかの場所では、隠れたオブジェクトは前景マーカーをもたないため、部分的に隠れた暗い色のオブジェクトは、隣接する明るい色のオブジェクトにマージされます。

別の便利な可視化の手法は、ラベル行列をカラー イメージとして表示することです。watershed および bwlabel で作成されたようなラベル行列は、label2rgb を使用して、可視化目的のためにトゥルーカラー イメージに変換できます。

Lrgb = label2rgb(L,"jet","w","shuffle");
imshow(Lrgb)
title("Colored Watershed Label Matrix")

透明性を使用して、この疑似色ラベル行列を元の強度イメージに重ね合わせることができます。

figure
imshow(I)
hold on
himage = imshow(Lrgb);
himage.AlphaData = 0.3;
title("Colored Labels Superimposed Transparently on Original Image")

参考

| | | | | | | | | | | |