分水嶺分割


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

    以下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


免責聲明!

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



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