分水嶺算法主要用於圖像分段,一般是把一副彩色圖像灰度化,而後再求梯度圖,最後在梯度圖的基礎上進行分水嶺算法,求得分段圖像的邊緣線。算法
下面左邊的灰度圖,能夠描述爲右邊的地形圖,地形的高度是由灰度圖的灰度值決定,灰度爲0對應地形圖的地面,灰度值最大的像素對應地形圖的最高點。編程
咱們能夠本身編程實現灰度圖的地形圖顯示,工程FirstOpenCV6就實現了簡單的這個功能,好比上邊的灰度圖,顯示爲:3d
對灰度圖的地形學解釋,咱們咱們考慮三類點:blog
1. 局部最小值點,該點對應一個盆地的最低點,當咱們在盆地裏滴一滴水的時候,因爲重力做用,水最終會匯聚到該點。注意:可能存在一個最小值面,該平面內的都是最小值點。get
2. 盆地的其它位置點,該位置滴的水滴會匯聚到局部最小點。it
3. 盆地的邊緣點,是該盆地和其它盆地交接點,在該點滴一滴水,會等機率的流向任何一個盆地。基礎
假設咱們在盆地的最小值點,打一個洞,而後往盆地裏面注水,並阻止兩個盆地的水聚集,咱們會在兩個盆地的水聚集的時刻,在交接的邊緣線上(也即分水嶺線),建一個壩,來阻止兩個盆地的水聚集成一片水域。這樣圖像就被分紅2個像素集,一個是注水盆地像素集,一個是分水嶺線像素集。bfc
下面的gif圖很好的演示了分水嶺算法的效果:im
在真實圖像中,因爲噪聲點或者其它干擾因素的存在,使用分水嶺算法經常存在過分分割的現象,這是由於不少很小的局部極值點的存在,好比下面的圖像,這樣的分割效果是毫無用處的。d3
爲了解決過分分割的問題,可使用基於標記(mark)圖像的分水嶺算法,就是經過先驗知識,來指導分水嶺算法,以便得到更好的圖像分段效果。一般的mark圖像,都是在某個區域定義了一些灰度層級,在這個區域的洪水淹沒過程當中,水平面都是從定義的高度開始的,這樣能夠避免一些很小的噪聲極值區域的分割。
下面的gif圖很好的演示了基於mark的分水嶺算法過程:
上面的過分分段圖像,咱們經過指定mark區域,能夠獲得很好的分段效果: