1. 程式人生 > >0043-使用Grabcut函式完成前景與背景的分割

0043-使用Grabcut函式完成前景與背景的分割

Graphcut主要用於影象背景與前景的分割,是一種基於圖論的分割方法,在計算機視覺領域中應用於前景分割、醫學處理、紋理分割及立體視覺等方面,類似於PS中的摳圖功能。基本圖論的分割技術是影象分割領域中新的研究熱點,該方法基於能量優化演算法,將影象分割問題轉換為圖的最小割優化問題。
Grabcut是Graphcut演算法的改進,Graphcut是一種直接基於圖切演算法的影象分割技術,僅僅需要確認前景與背景輸入,該演算法就可以完成背景與前景相似督導賦權圖,並通過最優切割來實現影象分割。Grabcut演算法可以不需要使用者互動,僅僅需要輸入包含目標前景的區域就可以完成前景與前景的分離。
Graphcut的目標和背景模型是灰度直方圖,Grabcut採用的是RGB三通道混合高斯模型;Graphcut的能量最小化分割是能通過一次計算實現的,而Grabcut是根據分割模型引數更新完成學的學習過程;Graphcut需要使用者輸入前景與背景區域點集,而Grabcut只需要提供含有背景的區域畫素集就可以完成分割。
上面三段話純屬裝逼,實際上,只是對Grabcut演算法和Graphcut演算法大致的介紹,想了解詳細原理

,可以加我的Q2034196302,我發你三篇文章,讓你能詳細瞭解原理。
 

OpenCV中提供了Grabcut函式用於實現Grabcut操作,原型如下:
C++: void grabCut(InputArray img, InputOutputArray mask, Rect rect, InputOutputArray bgdModel, InputOutputArray fgdModel, int iterCount, int mode=GC_EVAL )
引數意義如下:
img:輸入影象,要求是8-bit 3-channel 影象。
mask:輸入/輸出的掩碼圖。如果最後一個引數mode=GC_INIT_WITH_RECT,則掩碼影象由函式自行初始化。這個掩碼圖元素可能的取值如下:
GC_BGD:表示明顯的背景畫素,巨集義值為0;
GC_FGD:表示明顯的前景畫素,巨集義值為1;
GC_PR_BGD-可能為背景畫素的畫素,巨集義義的值為2
GC_PR_FGD-可能為前景畫素的畫素,巨集義義的值為3
rect

:演算法感興趣區域。區域之外被標記為明顯的背景,這個引數只有當mode=GC_INIT_WITH_RECT才有效。
bgdModel:迭代時使用的背景臨時陣列
fgdModel:迭代時使用的前景臨時陣列
rect:被使用者指定含前景的矩形區域,如果mode設為GC_INIT_WITH_RECT,那麼在使用rect對mask進行初始化時,rect區域之外的值統一為0
iterCount:演算法迭代次數,迭代次數越多,顯然越耗時間,但是對前景和背景的分割也越準。
mode:演算法模式。取值如下:
  GC_INIT_WITH_RECT:函式使用使用者提供的矩形區域進行相關狀態和mask的初始化。
  GC_INIT_WITH_MASK:函式使用使用者提供的mask進行相關狀態的初始化。
  GC_INIT_WITH_RECT 和 GC_INIT_WITH_MASK可以同時使用,這種情況下,矩形區域外的象素點將被初始化為GC_BGD狀態。
GC_EVAL
:The value means that the algorithm should just resume.【作者注:讀不懂這句話,有讀懂的可以加QQ2034196302說出自己的高見】

使用grabCut函式的示例程式碼如下:

程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取

執行結果如下圖所示