分水嶺算法就是根據分水嶺的構成來考慮圖像的分割,我們可以想像一個有山有湖的景象,山水環繞,而區分高山與水的界線,以及不同湖之間的間隔,就是我們的分水嶺。
分水嶺算法基本上是把影像看作是地貌,每一點像素的灰階值表示該點的海拔高度,每一個局部極小值及其影響區域稱為集水盆,我們從第0層填充影像,隨著水逐漸漲高,集水盆形成,這些盆地的尺寸緩緩增加,最終兩個不同的盆地水匯聚,這時創建一個分水嶺以保持兩個盆地分離,一旦水的層數到達最大值,這些創建的盆地和分水嶺的集合形成了分水嶺分割算法的結果。
OpenCV分水嶺:void watershed(InputArray image, InputOutputArray markers)
- image:輸入圖,8位元3通道圖。
- markers:輸入輸出標記圖,32位元單通道圖,尺寸必須和image相同。
實際使用時,image是我們要做分水嶺演算法的原始圖,使用markers前要先在上面標記,分別標記image的前景、後景,以及不確定前後景的像素位置,前景、後景位置的標籤值可以自己定義,不確定的位置設為0,函式呼叫後markers會更新,生成最終的分水嶺分割圖,分水嶺的位置為0。