這個程序是研一下學期的計算機視覺課程大作業,完成於 2013/06/16,是對 Soille 和 Vincent(1991)提出的模擬浸沒的分水嶺算法的實現,詳見下面的報告。
源碼托管在 Github 上:點擊進入鏈接
可執行程序及測試圖片:點擊進入鏈接
一、算法概述:
分水嶺算法是一種圖像分割算法,本報告是對Soille和Vincent(1991)提出的模擬浸沒的分水嶺算法的實現,算法包括2個部分:第一個部分是排序;第二部分為泛洪。算法描述如下:
(1)將原圖像轉為二值圖,對各像素點的灰度值進行從小到大排序,相同的灰度值為同一個層級。
(2)處理第一個層級所有的像素點,如果其鄰域已經被標識屬於某一個區域,則將這個像素加入一個先進先出的隊列。
(3)先進先出隊列非空時,彈出第一個元素。掃描該像素的鄰域像素,如果其鄰域像素的灰度屬於同一層(灰度值相等),則根據鄰域像素的標識來刷新該像素的標識。一直循環到隊列為空。
(4)再次掃描當前灰度值層級的像素,如果還有像素未被標識,說明它是一個新的極小區域,則當前區域的值(當前區域的值從0開始計數)加1后賦值給該為標識的像素。然后從該像素出發繼續執行步驟(3)的泛洪直至沒有新的極小區域。
(5)返回步驟(2),處理下一個灰度值層級的像素,直至所有層級的像素都被處理。
二、算法實現(C++、opencv、VS2010):
1、主要類說明(具體說明見附錄源碼中的注釋):
(1)WatershedPixel類:根據灰度值對圖像像素進行排序。
(2)WatershedStructure類:用於存儲像素點WatershedPixel,並生成各像素點的鄰域像素。
(3)WaterShedAlgorithm類:分水嶺核心算法,包括圖像預處理,泛洪和分水線繪制。
2、使用說明:
在命令提示符(cmd)中進入ws.exe(分水嶺算法的可執行文件)和圖片所在文件夾,
輸出:
image_name_Gray.jpg ——原圖像對應的灰度圖
image_name_Gray_WS.jpg ——在灰度圖中繪制的分水線
image_name_WS.jpg ——在黑色背景中繪制的分水線
3、其他說明:
本算法實現借助開源的opencv庫對圖像進行讀取、輸出和預處理(格式轉換等),ws.exe運行時需要opencv相關的動態鏈接庫(附件中的dll文件)。
三、算法測試:
1、灰度圖:
2、彩色圖:
四、結果分析:
(1)該算法實現相對簡單,速度快,分割效果不錯。
(2)但是在噪聲影響下會出現過分割,可在執行算法之前進行預處理,比如平滑降噪,以及利用梯度。
(3)對細節太多的彩色圖片存在過分割。