原理の説明、サンプルマクロの画像と画像処理アルゴリズムは、Image Segmentation with Watershed Algorithmを元にしています。
「Watershedアルゴリズム」の原理の説明
グレースケール画像は、高輝度ピクセルは山頂や丘を、低輝度ピクセルは谷を、示す地形図として見ることができます。
孤立したすべての谷(領域の最小輝度ピクセル)に異なる色の水(ラベル)を塗りつぶし始めます。近くの山(勾配)に応じて、水位が上がるにつれて、異なる色の異なる谷の水が合流し始めます。それを避けるために、水が合流する場所に壁を作ります。
すべてのピークが水面に達するまで、壁を埋める作業を続けます。作成した壁によって地形図(画像)を分割することができます。これが「Watershedアルゴリズム」です。(the CMM HomepageのアニメーションGIFを見ると理解しやすいと思います。)
ただし、画像内のノイズやその他の不規則性により、セグメント化が失敗する場合(過分割など)があります。
そこで、OpenCVはマーカーベースの「Watershedアルゴリズム」を実装しています。マーカーは、すべての谷の位置がマージされるかどうかを指定します。
具体的には、それぞれの谷に異なるラベルを与えます。フォアグラウンドであると確定している各領域と、背景であると確定している領域にラベルを付けます。そして、不確定な領域を0でラベル付けします。OpenCVの「Watershedアルゴリズム」を適用すると、マーカーは与えられたラベルで更新され、オブジェクトの境界は-1の値になります。
サンプル
サンプルマクロを用意しました。以下の手順で試してください。
- こちらからzipファイルをダウンロードしてください。
- 全て展開します。
water_coins.png
とOCV_Watershed_Macro.txt
、「File -> Open」で開きます。OCV__LoadLibrary
を実行します。OCV_Watershed_Macro.txt
を、「Macros -> Run Macro」で実行してください。