メインコンテンツ

watershed

説明

watershed 変換は、明るいピクセルが高い高度、暗いピクセルが低い高度を表す表面として扱うことにより、イメージ内の "集水域 (catchment basins)" または "流域の稜線 (watershed ridge lines)" を検出します。watershed 変換を使用して、連続する関心領域を個別のオブジェクトにセグメント化できます。

L = watershed(A) は、入力行列 A の watershed 領域を指定するラベル行列 L を返します。

L = watershed(A,conn) は watershed 計算で使用する連結性を指定します。

すべて折りたたむ

オーバーラップした 2 つの円形オブジェクトが含まれるバイナリ イメージを作成します。イメージを表示します。

center1 = -40;
center2 = -center1;
dist = sqrt(2*(2*center1)^2);
radius = dist/2 * 1.4;
lims = [floor(center1-1.2*radius) ceil(center2+1.2*radius)];
[x,y] = meshgrid(lims(1):lims(2));
bw1 = sqrt((x-center1).^2 + (y-center1).^2) <= radius;
bw2 = sqrt((x-center2).^2 + (y-center2).^2) <= radius;
bw = bw1 | bw2;
imshow(bw)
title('Binary Image with Overlapping Objects')

Figure contains an axes object. The hidden axes object with title Binary Image with Overlapping Objects contains an object of type image.

バイナリ イメージの補数の距離変換を計算します。出力イメージの各ピクセルの値は、そのピクセルから bw 内の最も近い非ゼロ ピクセルまでの距離です。

D = bwdist(~bw);
imshow(D,[])
title('Distance Transform of Binary Image')

Figure contains an axes object. The hidden axes object with title Distance Transform of Binary Image contains an object of type image.

Watershed 変換の場合に明るいピクセルが高い高度、暗いピクセルが低い高度を表すように、距離変換されたイメージの補数を取ります。

D = -D;
imshow(D,[])
title('Complement of Distance Transform')

Figure contains an axes object. The hidden axes object with title Complement of Distance Transform contains an object of type image.

Watershed 変換を計算します。ROI の外側にあるピクセルを 0 に設定します。

L = watershed(D);
L(~bw) = 0;

結果として得られるラベル行列を RGB イメージとして表示します。

rgb = label2rgb(L,'jet',[.5 .5 .5]);
imshow(rgb)
title('Watershed Transform')

Figure contains an axes object. The hidden axes object with title Watershed Transform contains an object of type image.

オーバーラップする 2 つ球が含まれる 3 次元バイナリ イメージを作成します。

center1 = -10;
center2 = -center1;
dist = sqrt(3*(2*center1)^2);
radius = dist/2 * 1.4;
lims = [floor(center1-1.2*radius) ceil(center2+1.2*radius)];
[x,y,z] = meshgrid(lims(1):lims(2));
bw1 = sqrt((x-center1).^2 + (y-center1).^2 + ...
           (z-center1).^2) <= radius;
bw2 = sqrt((x-center2).^2 + (y-center2).^2 + ...
           (z-center2).^2) <= radius;
bw = bw1 | bw2;
figure, isosurface(x,y,z,bw,0.5), axis equal, title('BW')
xlabel x, ylabel y, zlabel z
xlim(lims), ylim(lims), zlim(lims)
view(3), camlight, lighting gouraud

Figure contains an axes object. The axes object with title BW, xlabel x, ylabel y contains an object of type patch.

距離変換を計算します。

D = bwdist(~bw);
figure, isosurface(x,y,z,D,radius/2), axis equal
title('Isosurface of distance transform')
xlabel x, ylabel y, zlabel z
xlim(lims), ylim(lims), zlim(lims)
view(3), camlight, lighting gouraud

Figure contains an axes object. The axes object with title Isosurface of distance transform, xlabel x, ylabel y contains an object of type patch.

距離変換の補数を計算し、オブジェクトでないピクセルを Inf に強制し、watershed 変換を計算します。

D = -D;
D(~bw) = Inf;
L = watershed(D);
L(~bw) = 0;
figure
isosurface(x,y,z,L==1,0.5)
isosurface(x,y,z,L==2,0.5)
axis equal
title('Segmented objects')
xlabel x, ylabel y, zlabel z
xlim(lims), ylim(lims), zlim(lims)
view(3), camlight, lighting gouraud

Figure contains an axes object. The axes object with title Segmented objects, xlabel x, ylabel y contains 2 objects of type patch.

watershed セグメント化の際に、浅い局所的な最小値を抑制することでオーバーセグメンテーションを防ぐことができます。

セグメント化する梨の RGB イメージを読み込んで表示します。イメージをグレースケールに変換して表示します。各梨の中心部にある明るい部分は、局所的な最大値に対応しています。

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

Figure contains an axes object. The hidden axes object contains an object of type image.

watershed セグメント化では、このイメージは流域の稜線と集水域から成る地表面に似ています。地表面に水が流れ込むと、その水は集水域に蓄えられます。グレースケール イメージでは、局所的な最小値が集水域に相当します。梨をセグメント化するには、梨の中心部が局所的な最小値となるように、イメージを反転させます。

Icomp = imcomplement(I);
imshow(Icomp)

Figure contains an axes object. The hidden axes object contains an object of type image.

反転したイメージを 3 次元表面として表示します。このとき、各ピクセルの 3 番目の次元が強度値となります。各梨の深い領域の底はスパイク状になっています。これは、水が蓄えられる集水域のように、数多くの浅い局所的な最小値を表しています。

surf(Icomp,EdgeColor="none")
colormap(gray)

Figure contains an axes object. The axes object contains an object of type surface.

フィルター処理されていないイメージをセグメント化し、その結果をラベルとして元のイメージに重ね合わせて表示します。このイメージは細かくセグメント化されすぎています。これは、各梨に 1 つのマスクが割り当てられているのではなく、数多くの小さなマスクが存在することを意味しています。

L = watershed(Icomp);
overlay = labeloverlay(I,L);
imshow(overlay)

Figure contains an axes object. The hidden axes object contains an object of type image.

H-minima 変換を適用し、浅い最小値を抑制します。h の値は試行錯誤で決定されています。この値を変更し、h の値がセグメント化の結果に与える影響を確認してください。

h = 30;
Ifilt = imhmin(Icomp,h);

フィルター処理されたイメージを 3 次元表面として表示します。

surf(Ifilt,EdgeColor="none")
colormap(gray)

Figure contains an axes object. The axes object contains an object of type surface.

フィルター処理されたイメージをセグメント化し、その結果を表示します。このイメージでは、前景にある各梨に概ね 1 つのマスクが割り当てられています。

Lfilt = watershed(Ifilt);
overlayfilt = labeloverlay(I,Lfilt);
imshow(overlayfilt)

Figure contains an axes object. The hidden axes object contains an object of type image.

入力引数

すべて折りたたむ

入力イメージ。任意の次元の数値配列または logical 配列として指定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

ピクセルの連結性。次の表のいずれかの値を指定します。既定の連結性は 2 次元イメージでは 8、3 次元イメージでは 26 です。

意味

2 次元連結性

4

ピクセルのエッジの部分が接触している場合、ピクセルは連結されます。ピクセルの近傍は水平方向または垂直方向に隣接するピクセルです。

3-by-3 pixel neighborhood with four pixels connected to the center pixel

現在のピクセルを灰色で示します。

8

ピクセルのエッジまたはコーナーが接触している場合、ピクセルは連結されます。ピクセルの近傍は水平方向、垂直方向または対角方向に隣接するピクセルです。

3-by-3 pixel neighborhood with 8 pixels connected to the center pixel

現在のピクセルを灰色で示します。

3 次元連結性

6

面が接触している場合、ピクセルは連結されます。ピクセルの近傍は次のように隣接するピクセルです。

  • 次のいずれかの方向: 奥、手前、左、右、上および下

3-by-3-by-3 pixel neighborhood with 6 pixels connected to the faces of the center pixel

現在のピクセルを灰色で示します。

18

面またはエッジが接触している場合、ピクセルは連結されます。ピクセルの近傍は次のように隣接するピクセルです。

  • 次のいずれかの方向: 奥、手前、左、右、上および下

  • 右下または上の奥など、2 つの方向の組み合わせ

3-by-3-by-3 pixel neighborhood with 6 pixels connected to the faces and 12 pixels connected to the edges of the center pixel

現在のピクセルは立方体の中心です。

26

面、エッジまたはコーナーが接触している場合、ピクセルは連結されます。ピクセルの近傍は次のように隣接するピクセルです。

  • 次のいずれかの方向: 奥、手前、左、右、上および下

  • 右下または上の奥など、2 つの方向の組み合わせ

  • 右上の奥または左下の奥など、3 つの方向の組み合わせ

3-by-3-by-3 pixel neighborhood with 6 pixels connected to the faces, 12 pixels connected to the edges, and 8 pixels connected to the corners of the center pixel

現在のピクセルは立方体の中心です。

高次元の場合、watershed は既定値 conndef(ndims(A),"maximal") を使用します。

連結性は、01 から成る 3 × 3 × ... × 3 行列を指定し、任意の次元に対してより一般的に定義することもできます。1 の値を持つ要素は、conn の中心要素に対する近傍の位置を定義します。conn は、その中心要素に関して対称でなければなりません。詳細については、カスタム連結性の定義を参照してください。

メモ

既定以外の連結性を指定した場合、イメージのエッジ上のピクセルは境界上のピクセルであると見なされません。たとえば、conn = [0 0 0; 1 1 1; 0 0 0] の場合、最初と最後の行の上の要素は、連結性の定義に従って、イメージの外側の領域と接続していないため境界のピクセルとは見なされません。

データ型: double | logical

出力引数

すべて折りたたむ

ラベル行列。非負の整数の数値配列として指定します。0 とラベル付けされた要素は、固有の watershed 領域には属しません。1 とラベル付けされた要素は、最初の watershed 領域に属し、2 とラベル付けされた要素は、2 番目の watershed 領域に属する、というようになります。

ヒント

  • オーバーセグメンテーションを防ぐには、関数 watershed を使用する前に関数 imhmin を使用して、浅い位置にある最小値をイメージから削除します。

アルゴリズム

watershed は Fernand Meyer アルゴリズムを使用します [1]

参照

[1] Meyer, Fernand, "Topographic distance and watershed lines,” Signal Processing , Vol. 38, July 1994, pp. 113-125.

拡張機能

すべて展開する

バージョン履歴

R2006a より前に導入

すべて展開する