OCV_Watershed(Watershed領域分割)
1. 概要
「分水嶺アルゴリズム」を用いて、くっつき合っている複数のオブジェクトを切り離す高度な領域分割手法です。 画像を地形で見た時の「盆地」とみなし、指定された「種(マーカー)」から水を満たしていくように領域を広げ、水たまりがぶつかった場所を境界線として分割します。
2. 「Watershedアルゴリズム」の詳細
原理の説明は、[[Image Segmentation with Watershed Algorithm|http://docs.opencv.org/4.x/d3/db4/tutorial_py_watershed.html]]を元にしています。
グレースケール画像は、高輝度ピクセルは山頂や丘を、低輝度ピクセルは谷を、示す地形図として見ることができます。
孤立したすべての谷(領域の最小輝度ピクセル)に異なる色の水(ラベル)を塗りつぶし始めます。近くの山(勾配)に応じて、水位が上がるにつれて、異なる色の異なる谷の水が合流し始めます。それを避けるために、水が合流する場所に壁を作ります。
すべてのピークが水面に達するまで、壁を埋める作業を続けます。作成した壁によって地形図(画像)を分割することができます。これが「Watershedアルゴリズム」です。([[the CMM Homepage|https://people.cmm.minesparis.psl.eu/users/beucher/wtshed.html]]のアニメーションGIFを見ると理解しやすいと思います。)
ただし、画像内のノイズやその他の不規則性により、セグメント化が失敗する場合(過分割など)があります。
そこで、OpenCVはマーカーベースの「Watershedアルゴリズム」を実装しています。マーカーは、すべての谷の位置がマージされるかどうかを指定します。
具体的には、それぞれの谷に異なるラベルを与えます。フォアグラウンドであると確定している各領域と、背景であると確定している領域にラベルを付けます。そして、不確定な領域を0でラベル付けします。OpenCVの「Watershedアルゴリズム」を適用すると、マーカーは与えられたラベルで更新され、オブジェクトの境界は-1の値になります。
3. GUIの使い方

- src: 元のカラー画像(RGB画像)を選択します。
- mask: あらかじめ各物体の「核」となる部分を異なる数値で塗った 32-bitマーカー画像 を選択します。
3. 注意点
- 元画像は必ず RGB (24-bit)、マーカー画像は 32-bit (Float/Integer) である必要があります。
- 両方の画像は全く同じサイズである必要があります。
KEEP_PREVIEWに対応しており、マーカーの調整効果をライブで確認できます。