Lazysnapping Grabcut 算法實現的結果

8月8號到8月18號,根據Lazysnapping的論文和一些資料,做了算法實現 但是前期處理和LS不同, 其實不算真正實現LS。

有人用通俗易懂的話這樣解釋:

首先,當一張圖被導入到Lazy snapping中時,軟件會自動採用watershed對該圖進行處理。接下來,用戶通過劃線,確定F和B。如果從像素點的角度來看,一旦畫了一條線,則這條線經過的像素點被稱爲“種子點”,這些“種子點”所涉及到的區域被稱爲“種子區域”。藉助這些“種子區域”將圖片分爲F 和B 。利用Graph Cut優化算法,圖片上所有區域會被賦予惟一的屬性,不屬於“前景區域”就一定會屬於“背景區域”。
在經過處理後的圖片中,相鄰的區域連接在一起。而接下來Graph Cut優化算法要做的,就是嘗試將每個非“種子區域”分別與“前景區域”(或“背景區域”)之間的通路“打斷”。如果全部通路都可以被打斷,則軟件猜測該區域不屬於F,則可能屬於B。也就將我們所需要的前景的大致輪廓勾勒了出來。
Graph Cut 優化的準則,考慮了每一個區域的顏色與種子區域之間的顏色相似性,顏色越像“前景區域”就越可能被分在前景。同時它也考慮了相鄰區域的顏色差別,顏色差別越大這兩個區域越可能被分開。這個優化問題可以用圖論中極大流(極小割)的方法很快解決。

 

實質上就是圖像裏面將問題轉換成最大流最小割問題。 主要是將前景設置爲sink 也就是終點, 背景設置爲source 源。中間點 根據它們離前景和背景的每個像素點的顏色差值 來設置流入和流出權重,離前景越近 流入的權重越多 流出的權重越少。每條邊的值 是與顏色差成反比,兩個點顏色越不相似,值越小,也就是容積越小。 這個是GrabCut的本質 因爲LS的關鍵是將Grabcut和預處理進行了很好的結合,將速度提升了。而這一步,我是沒做的。

傻乎乎的寫完之後 ,才弄清楚。。。。哎 回頭有空用opencv裏的資源再實現一次。

 

基本框架來自於 http://lzhj.me/archives/93 的源碼,thx

他的和原文的差別主要在 GraphCut的預處理 是通過降低像素來進行,原文用了watershed來初分割。

其次,原文不是用平均距離來計算 該點到F其他點的距離,而是將F中的點進行64的kmeans聚類,然後尋找其中最小的距離點。

再次,E2的計算方法不同。

然後改進根據gimp的開源代碼進行了改進  http://graphics.ethz.ch/teaching/former/imagesynthesis_06/miniprojects/p2/index.html

lzhj的程序 分割 出來會有許多零碎區域,但是如果在計算E1時,加入kmeans聚類,則 這樣的 區域會減少很多。

而對E2的修正 能夠 很好的提升結果。

採用一些小小的技巧,可以使得算法不一定要背景筆 也能得到目標分割

算法前期處理改進可以有兩個方面,meanshift 和watershed。

前期處理測試watershed floodfilled 但不知爲啥 效果不佳,估計哪裏出了點小錯。沒繼續修改了,最後加入Meanshift結合金字塔算法對圖像進行平滑,平滑前用floodfilled算法 很難獲取比較大的區域,平滑後,如果目標不是很複雜,是可以獲取整個目標區域的。

 

將用gimp測試圖跑的結果放上來:

 

爲了速度快,我將圖壓縮了,所以會有一點鋸齒。

如果沒有這個需求 可以跑出很精緻的圖的。

 

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