分水嶺分割利用圖像形態學進行圖像區域分割。它將圖像灰度值看作一幅地形圖,在地形圖的局部極小值處與地形最低點是連通的,從最低點開始注水,水流會逐漸淹沒地形較低點構成的區域,直到整個圖像被淹沒。在這個過程中,通過相關形態學處理,可以實現一幅圖像的分水嶺分割。
以下GIF圖像給出了形象說明:

圖像來自 https://www.cnblogs.com/mikewolf2002/p/3304118.html
分水嶺分割具體算法思想如下:
1 設
為地形圖上完成分割后的 r 個蓄水池,
為完成分割后蓄水池
內的像數集合,
為地形圖上灰度值小於 n 的像數集合;
2 當水面上漲到 n 時,當前蓄水池
被淹沒的像數集合可表示為:
,
當前所有蓄水池被淹沒的像數集合表示為:
;
3 假設第 n 步時,
已知, 令 Q 表示
集合構成的連通區域,通過考察 Q 上各個連通區域 q 與
連通區域關系,分別進行如下處理:
1)
為空時,發現一個新的蓄水池 q,將 q 加入
;
2)
不為空,但僅包含
的一個連通分量,將 q 合並到
中構成
,蓄水池面積擴大,但數量保持不變;
3)
不為空,但包含
的兩個及兩個以上連通分量,此時需要構造堤壩防止
中蓄水池融合;
4 重復步驟3,直到 n = nmax + 1 時,
表示整個圖像像數,分割完成,
各個連通區域即為分割的蓄水池區域,留下的堤壩則為分割邊界。
以上為分水嶺分割基本思想,圖像的每個極小值點構成一個蓄水池的中心點。由於圖像中存在較多極小值點,故一般圖像分水嶺分割可能得到很多小的區域。可以通過手動設定蓄水池位置來避免過多極小值影響,算法僅認為設定點為蓄水池中心點,從而忽略掉任意其他極小值點。
同時,可以首先對圖像進行一階微分處理,在圖像平滑區域圖像梯度值較小,在圖像邊緣區域梯度值較大。然后使用梯度圖像作為地形圖,可以分割出平滑圖像塊。
在 opencv 中,函數 cv::watershed() 實現了分水嶺分割,該函數將圖像邊緣轉換為地形圖上的山脊,圖像平滑區域轉換為地形圖上的山谷,同時使用 markers 參數標記蓄水池,實現分水嶺分割,具體如下:
void cv::watershed(cv::InputArray image, cv::InputOutputArray markers);
image: 8位3通道圖像,函數對圖像進行一階微分處理,視梯度圖為地形圖上的山脊與山谷;
markers: 32位有符號整數圖像,使用 1,2,3... 等序號標記不同的蓄水池。當完成分割后,該圖像形成最終蓄水池區域標記圖像,其中,值 -1 表示區域邊界。
以下給出 cv::watershed() 分析截圖:


參數資料 醫學圖像處理與分析 羅述謙 周果宏
https://www.cnblogs.com/mikewolf2002/p/3304118.html
