新手學,java使用分水嶺算法進行圖像分割(二)

最近要考試了,所以現在不寫,怕這段時間都沒空寫了。(算法的效率暫時不考慮,有時間了再來解決彩色信息和效率問題)

繼上一篇的算法:http://blog.csdn.net/abcd_d_/article/details/41218549,本文對分水嶺算法進行了區域合併,合併準則採用hsv顏色空間的區域特徵的直方圖相似度進行合併。且看效果:圖一是原圖,圖二是採用之前的文章算法的效果,圖三爲進行了區域合併後的效果。(大小被我調整過)

(圖一)

(圖二)


(圖三)


在第一篇的基礎之上,增加了區域合併算法,也就是下圖中劃橫線的兩個關鍵方法。可以從上圖中看出,區域合併能有效去除過分割問題。

第一個方法相對簡單,遍歷圖像找出領域關係,並存儲在hashMap的一個對象nodes中。關鍵在第二個方法arearCombine(),它需要遍歷nodes中的區域,並根據合併準則(這裏是面積大小和區域相似度),判斷是否把該區域合併到合適的領域中,這樣兩個區域就變爲一個新區域。(這裏涉及到鄰接圖的合併) 這樣一遍一遍下來,直到沒有區域被合併爲止。

問題看似簡單,但是問題來了,就是nodes這個數據結構每一次遍歷後都會被修改,因此涉及到hashMap等集合不同在遍歷的同時,又對其進行修改的問題。本文的方法比較笨,就是採用先記錄下要修改的信息,然後在遍歷完成之後再進行修改(這個麻煩,有更好的方法的朋友,請不吝賜教^_^)。

最後說明一下,本文要根據區域特徵進行合併,所以添加了一個輔助類Img_Area_Feature ,該類記錄下區域特徵,並且進行區域的一些合併或者添加像素點操作。另外,文章的區域合併算法的關鍵在於合併準則的選擇,修改size(面積)、similarity(相似度)的判斷標準則,以及修改相似的判斷方法均對效果產生直接影響,這也是這個合併算法的不足之處。

	/**
						 * ///此處的合併準則直接影響合併效果!!!!!!!!!!!!!!!!!!!!
						 */
						if(size<30){
							////少於10個像素,則合併到其中一個臨域中
							simMap.put(similarity, child.getKey());
						}else if(similarity<0.1&&similarity!=-1&&size<500){
							///大於10個像素,則根據與臨域的飽和度差和色調差選擇性合併
							simMap.put(similarity, child.getKey());
						}else if(similarity<0.2&&similarity!=-1&&size<200){
							///大於10個像素,則根據與臨域的飽和度差和色調差選擇性合併
							simMap.put(similarity, child.getKey());
						}
例如,將上面的判斷條件size<30改爲size<100則效果如下圖(圖四),可以發現效果變化很明顯:

(圖四)


最後附上代碼地址:http://download.csdn.net/detail/abcd_d_/8223951 (要一個積分:最近要下載,積分緊張,所以。。。)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章