watershed
Watershed 変換
説明
watershed 変換は、明るいピクセルが高い高度、暗いピクセルが低い高度を表す表面として扱うことにより、イメージ内の "集水域 (catchment basins)" または "流域の稜線 (watershed ridge lines)" を検出します。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')
バイナリ イメージの補数の距離変換を計算します。出力イメージの各ピクセルの値は、そのピクセルから bw 内の最も近い非ゼロ ピクセルまでの距離です。
D = bwdist(~bw);
imshow(D,[])
title('Distance Transform of Binary Image')
Watershed 変換の場合に明るいピクセルが高い高度、暗いピクセルが低い高度を表すように、距離変換されたイメージの補数を取ります。
D = -D;
imshow(D,[])
title('Complement of Distance Transform')
Watershed 変換を計算します。ROI の外側にあるピクセルを 0 に設定します。
L = watershed(D); L(~bw) = 0;
結果として得られるラベル行列を RGB イメージとして表示します。
rgb = label2rgb(L,'jet',[.5 .5 .5]); imshow(rgb) title('Watershed Transform')

オーバーラップする 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

距離変換を計算します。
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

距離変換の補数を計算し、オブジェクトでないピクセルを 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

watershed セグメント化の際に、浅い局所的な最小値を抑制することでオーバーセグメンテーションを防ぐことができます。
セグメント化する梨の RGB イメージを読み込んで表示します。イメージをグレースケールに変換して表示します。各梨の中心部にある明るい部分は、局所的な最大値に対応しています。
RGB = imread("pears.png");
I = im2gray(RGB);
imshow(I)
watershed セグメント化では、このイメージは流域の稜線と集水域から成る地表面に似ています。地表面に水が流れ込むと、その水は集水域に蓄えられます。グレースケール イメージでは、局所的な最小値が集水域に相当します。梨をセグメント化するには、梨の中心部が局所的な最小値となるように、イメージを反転させます。
Icomp = imcomplement(I); imshow(Icomp)

反転したイメージを 3 次元表面として表示します。このとき、各ピクセルの 3 番目の次元が強度値となります。各梨の深い領域の底はスパイク状になっています。これは、水が蓄えられる集水域のように、数多くの浅い局所的な最小値を表しています。
surf(Icomp,EdgeColor="none")
colormap(gray)
フィルター処理されていないイメージをセグメント化し、その結果をラベルとして元のイメージに重ね合わせて表示します。このイメージは細かくセグメント化されすぎています。これは、各梨に 1 つのマスクが割り当てられているのではなく、数多くの小さなマスクが存在することを意味しています。
L = watershed(Icomp); overlay = labeloverlay(I,L); imshow(overlay)

H-minima 変換を適用し、浅い最小値を抑制します。h の値は試行錯誤で決定されています。この値を変更し、h の値がセグメント化の結果に与える影響を確認してください。
h =
30;
Ifilt = imhmin(Icomp,h);フィルター処理されたイメージを 3 次元表面として表示します。
surf(Ifilt,EdgeColor="none")
colormap(gray)
フィルター処理されたイメージをセグメント化し、その結果を表示します。このイメージでは、前景にある各梨に概ね 1 つのマスクが割り当てられています。
Lfilt = watershed(Ifilt); overlayfilt = labeloverlay(I,Lfilt); imshow(overlayfilt)

入力引数
入力イメージ。任意の次元の数値配列または logical 配列として指定します。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
ピクセルの連結性。次の表のいずれかの値を指定します。既定の連結性は 2 次元イメージでは 8、3 次元イメージでは 26 です。
値 | 意味 | |
|---|---|---|
2 次元連結性 | ||
| ピクセルのエッジの部分が接触している場合、ピクセルは連結されます。ピクセルの近傍は水平方向または垂直方向に隣接するピクセルです。 |
現在のピクセルを灰色で示します。 |
| ピクセルのエッジまたはコーナーが接触している場合、ピクセルは連結されます。ピクセルの近傍は水平方向、垂直方向または対角方向に隣接するピクセルです。 |
現在のピクセルを灰色で示します。 |
3 次元連結性 | ||
| 面が接触している場合、ピクセルは連結されます。ピクセルの近傍は次のように隣接するピクセルです。
|
現在のピクセルを灰色で示します。 |
| 面またはエッジが接触している場合、ピクセルは連結されます。ピクセルの近傍は次のように隣接するピクセルです。
|
現在のピクセルは立方体の中心です。 |
| 面、エッジまたはコーナーが接触している場合、ピクセルは連結されます。ピクセルの近傍は次のように隣接するピクセルです。
|
現在のピクセルは立方体の中心です。 |
高次元の場合、watershed は既定値 を使用します。conndef(ndims(A),"maximal")
連結性は、0 と 1 から成る 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.
拡張機能
使用上の注意および制限:
watershedでは C コードの生成がサポートされています (MATLAB® Coder™ が必要)。汎用のMATLAB Host Computerターゲット プラットフォームを選択した場合、プリコンパイルされたプラットフォーム固有の共有ライブラリを使用するコードが、watershedによって生成されます。共有ライブラリを使用するとパフォーマンスの最適化は維持されますが、コードを生成できるターゲット プラットフォームが限定されます。詳細については、Image Processing Toolbox でサポートされているコード生成のタイプを参照してください。2 次元イメージのみをサポートします。
サポートされる連結性は
4または8のみです。65,535 までの領域を含めるイメージをサポートします。
出力タイプは常に
uint16です。
使用上の注意および制限:
2 次元イメージのみをサポートします。
サポートされる連結性は
4または8のみです。65,535 までの領域を含めるイメージをサポートします。
出力タイプは常に
uint16です。
watershed 関数は、スレッドベースの環境を完全にサポートします。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
バージョン履歴
R2006a より前に導入watershed は、スレッドベースの環境をサポートするようになりました。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)




