經典分水嶺算法的 C++ 實現


這個程序是研一下學期的計算機視覺課程大作業,完成於 2013/06/16,是對 Soille 和 Vincent(1991)提出的模擬浸沒的分水嶺算法的實現,詳見下面的報告。

源碼托管在 Github 上:點擊進入鏈接

可執行程序及測試圖片:點擊進入鏈接

一、算法概述:

分水嶺算法是一種圖像分割算法,本報告是對Soille和Vincent(1991)提出的模擬浸沒的分水嶺算法的實現,算法包括2個部分:第一個部分是排序;第二部分為泛洪。算法描述如下:

(1)將原圖像轉為二值圖,對各像素點的灰度值進行從小到大排序,相同的灰度值為同一個層級。

(2)處理第一個層級所有的像素點,如果其鄰域已經被標識屬於某一個區域,則將這個像素加入一個先進先出的隊列。

(3)先進先出隊列非空時,彈出第一個元素。掃描該像素的鄰域像素,如果其鄰域像素的灰度屬於同一層(灰度值相等),則根據鄰域像素的標識來刷新該像素的標識。一直循環到隊列為空。

(4)再次掃描當前灰度值層級的像素,如果還有像素未被標識,說明它是一個新的極小區域,則當前區域的值(當前區域的值從0開始計數)加1后賦值給該為標識的像素。然后從該像素出發繼續執行步驟(3)的泛洪直至沒有新的極小區域。

(5)返回步驟(2),處理下一個灰度值層級的像素,直至所有層級的像素都被處理。

二、算法實現(C++opencvVS2010):

1、主要類說明(具體說明見附錄源碼中的注釋):

(1)WatershedPixel類:根據灰度值對圖像像素進行排序。

(2)WatershedStructure類:用於存儲像素點WatershedPixel,並生成各像素點的鄰域像素。

(3)WaterShedAlgorithm類:分水嶺核心算法,包括圖像預處理,泛洪和分水線繪制。

2、使用說明:

在命令提示符(cmd)中進入ws.exe(分水嶺算法的可執行文件)和圖片所在文件夾,

輸入:ws image_name

輸出:

image_name_BW.jpg ——原圖像對應的二值圖

image_name_Gray.jpg ——原圖像對應的灰度圖

image_name_Gray_WS.jpg ——在灰度圖中繪制的分水線

image_name_WS.jpg ——在黑色背景中繪制的分水線

3、其他說明:

本算法實現借助開源的opencv庫對圖像進行讀取、輸出和預處理(格式轉換等),ws.exe運行時需要opencv相關的動態鏈接庫(附件中的dll文件)。

三、算法測試:

1、灰度圖:

clip_image002

clip_image004

2、彩色圖:

clip_image006

clip_image008

clip_image010clip_image012

clip_image014clip_image016

四、結果分析:

(1)該算法實現相對簡單,速度快,分割效果不錯。

(2)但是在噪聲影響下會出現過分割,可在執行算法之前進行預處理,比如平滑降噪,以及利用梯度。

(3)對細節太多的彩色圖片存在過分割。


免責聲明!

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



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