Grabcut

1 導語

 

想跟偶像合影,但是一直沒有機會,怎麼辦?PS,太複雜,不太會。美圖秀秀,只能增白磨皮。最後還是編程靠譜


這裏用的技術就是GrabcutGrabcut主要是一種交互式分割算法,用戶需要圈出自己想要分割的東西,grabcut會迭代地將其分割出來,並且迭代過程中用戶可以交互。下圖實驗中只是圈出矩形,並未交互,可以看出算法效果還是非常魯棒的。

 

 


 

 

下圖由於部分背景跟我們想要分割的前景比較相似,因此做了一些交互


 

 

Grabcut主要涉及了Mincut/Maxflow問題,Mincut/Maxflowgraphcutgrabcut等利用能量最小割做圖像分割算法的核心,在之前的帖子中已經詳細介紹。因此本節中先簡單帶過GMM,然後再進入GrabCut

 

2 小談GMM

高斯混合模型聽起來聽高端大氣上檔次了,然後感覺有些太數學,好多人就有點發怵,其實很簡單,大多數人在日常生活中可能都用過這個技術。比如說某個人在炒股,最近股市動盪非常,自己又不懂金融股市,又想賺點小錢,那找到兩個懂點的人預測下下個月的A股。A預測了一個在4000點左右的高斯分佈,B預測了一個在3000點左右的高斯分佈,如下圖。但是A的水平要高些,預測的準確率80%B的水平相對弱些,預測的準確率20%,因此我們把兩者乘以相應的係數疊加得到了一個高斯混合模型,也就是第三幅圖。


 

但是一般情況下大部分的用法是我們知道第三幅圖,去推測第一第二圖,這就是GMMEM的核心,可以用在固定攝像頭下的運動物體(前景)檢測。

 

假設我們在監控一個房間,我們的圖片就呈現了這個房間的樣子,這時來了一個人,我們怎麼找到這個運動前景的位置呢。我們對圖片的每個像素建一個高斯混合模型,比如圖片的某個像素是一個一閃一閃的燈,閃的時候像素是255,不閃的時候是0。我們取連續的100幀作爲背景圖像,由於不閃的時間更多和相機成相的原因,80幀左右的像素都在0左右,20幀左右都在255左右,因此我們的高斯混合模型由均值在2550的高斯分佈構成,均值255的權重爲0.2,均值爲0的權重我0.8.現在我們有一個前景剛好覆蓋了這個像素,新的像素值爲100,如果這個值都不在剛剛的哪個高斯分佈的2.5sigma(方差)範圍內,我們就認爲它是前景。

 

3 GrabCut

 


這裏從簡單理解的角度去分析Grabcut.既然我們已經介紹了mincutGMM,那麼,grabcut是怎麼和上面的兩個問題聯繫起來的的呢?

如上圖,除了灰色的圖像像素外,我們和mincut問題一樣也有兩個頂點ST。不過這兩個點是虛擬的,最開始ST跟所有的像素都有聯繫(邊),當最後完成分割後,和S還有聯繫的就作爲前景,跟T還有聯繫的就作爲背景。

如果GrabCut要用到mincut,唯一我們要做的就是怎麼定義邊和這些邊的權重,使得最後的最小割就是我們想要的分割。ST的邊我們已經定義了,然後我們規定像素只跟旁邊4連通或者8連通的像素有聯繫(這裏我們採用8連通),這樣我們就定義好了邊,接着我們來定義權重。當一個點跟S有聯繫時,如果它是前景,我們希望它的權重越大越大,反之越小越好。那問題來了,我們一開始就不知道哪個是前景還是背景,那怎麼辦呢。我們可以爲前景和背景建模,一開始我們不是框出了一個框麼,我們可以把框內的都當做前景,框外的都當做前景,然後分別用GMM去建模(Graph Cuts中用直方圖建模)



 

那麼像素點跟ST的權重定義如下。一個點PS T的權重就是找他們在FB混合高斯模型中的概率,概率越大,我們的權重應該越大,因爲我們越不希望它分割開來。如果一個點在F中,那麼它跟S點的連接權重爲lemda,T的連接權重爲-log(pf)。這裏我自己也有個問題,爲什麼跟S的連接權重爲lemda.

 

像素點跟連通像素點的權重與距離和它們的像素差有關。像素值相差越小,距離相差越小,權重也越大。


 

如果我們現在就分割的話會不準確,因爲我們把框內所有的都當成前景,很顯然其中有一些不是。因此我們需要按照高斯混合模型的解法去迭代,迭代的過程中可以有交互。參考論文中的流程算法。


 

[1]“GrabCut” — Interactive Foreground Extraction using Iterated GraphCuts

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