OpenCV學習(7) 分水嶺算法(1)


        分水嶺算法主要用於圖像分段,通常是把一副彩色圖像灰度化,然后再求梯度圖,最后在梯度圖的基礎上進行分水嶺算法,求得分段圖像的邊緣線。

        下面左邊的灰度圖,可以描述為右邊的地形圖,地形的高度是由灰度圖的灰度值決定,灰度為0對應地形圖的地面,灰度值最大的像素對應地形圖的最高點。

ima1 (2)ima2

我們可以自己編程實現灰度圖的地形圖顯示,工程FirstOpenCV6就實現了簡單的這個功能,比如上邊的灰度圖,顯示為:

image

對灰度圖的地形學解釋,我們我們考慮三類點

1. 局部最小值點,該點對應一個盆地的最低點,當我們在盆地里滴一滴水的時候,由於重力作用,水最終會匯聚到該點。注意:可能存在一個最小值面,該平面內的都是最小值點。

2. 盆地的其它位置點,該位置滴的水滴會匯聚到局部最小點。

3. 盆地的邊緣點,是該盆地和其它盆地交接點,在該點滴一滴水,會等概率的流向任何一個盆地。

image

       假設我們在盆地的最小值點,打一個洞,然后往盆地里面注水,並阻止兩個盆地的水匯集,我們會在兩個盆地的水匯集的時刻,在交接的邊緣線上(也即分水嶺線),建一個壩,來阻止兩個盆地的水匯集成一片水域。這樣圖像就被分成2個像素集,一個是注水盆地像素集,一個是分水嶺線像素集。

      下面的gif圖很好的演示了分水嶺算法的效果:

lpe1 (1)ima3 (1)

     

     在真實圖像中,由於噪聲點或者其它干擾因素的存在,使用分水嶺算法常常存在過度分割的現象,這是因為很多很小的局部極值點的存在,比如下面的圖像,這樣的分割效果是毫無用處的。

ima7ima7b

      為了解決過度分割的問題,可以使用基於標記(mark)圖像的分水嶺算法,就是通過先驗知識,來指導分水嶺算法,以便獲得更好的圖像分段效果。通常的mark圖像,都是在某個區域定義了一些灰度層級,在這個區域的洪水淹沒過程中,水平面都是從定義的高度開始的,這樣可以避免一些很小的噪聲極值區域的分割。

      下面的gif圖很好的演示了基於mark的分水嶺算法過程:

ima4lpe2ima5

      上面的過度分段圖像,我們通過指定mark區域,可以得到很好的分段效果:

 

ima8ima9


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM