圖像分割之GraphCut、GrabCut(GMM)

圖像分割之(二)Graph Cut(圖割)

http://blog.csdn.net/zouxy09

 

       之前對主要的分割方法做了一個概述。那下面我們對其中幾個比較感興趣的算法做個學習。下面主要是Graph Cut和Grab Cut,兩者都是基於圖論的分割方法。另外OpenCV實現了Grab Cut,具體的源碼解讀見博文更新。

       Graph cuts是一種十分有用和流行的能量優化算法,在計算機視覺領域普遍應用於前背景分割(Image segmentation)、立體視覺(stereo vision)、摳圖(Image matting)等。

       此類方法把圖像分割問題與圖的最小割(min cut)問題相關聯。首先用一個無向圖G=<VE>表示要分割的圖像,VE分別是頂點(vertex)和邊(edge)的集合。此處的Graph和普通的Graph稍有不同。普通的圖由頂點和邊構成,如果邊的有方向的,這樣的圖被則稱爲有向圖,否則爲無向圖,且邊是有權值的,不同的邊可以有不同的權值,分別代表不同的物理意義。而Graph Cuts圖是在普通圖的基礎上多了2個頂點,這2個頂點分別用符號”S”和”T”表示,統稱爲終端頂點。其它所有的頂點都必須和這2個頂點相連形成邊集合中的一部分。所以Graph Cuts中有兩種頂點,也有兩種邊。

第一種頂點和邊是:第一種普通頂點對應於圖像中的每個像素。每兩個鄰域頂點(對應於圖像中每兩個鄰域像素)的連接就是一條邊。這種邊也叫n-links

第二種頂點和邊是:除圖像像素外,還有另外兩個終端頂點,叫Ssource:源點,取源頭之意)和Tsink:匯點,取匯聚之意)。每個普通頂點和這2個終端頂點之間都有連接,組成第二種邊。這種邊也叫t-links

       上圖就是一個圖像對應的s-t圖,每個像素對應圖中的一個相應頂點,另外還有st兩個頂點。上圖有兩種邊,實線的邊表示每兩個鄰域普通頂點連接的邊n-links,虛線的邊表示每個普通頂點與st連接的邊t-links。在前後景分割中,s一般表示前景目標,t一般表示背景。

       圖中每條邊都有一個非負的權值we,也可以理解爲cost(代價或者費用)。一個cut(割)就是圖中邊集合E的一個子集C,那這個割的cost(表示爲|C|)就是邊子集C的所有邊的權值的總和。

         Graph Cuts中的Cuts是指這樣一個邊的集合,很顯然這些邊集合包括了上面2種邊,該集合中 所有邊的斷開(????) 會導致殘留”S”和”T”圖的分開,所以就稱爲“割”。如果一個割,它的邊的所有權值之和最小,那麼這個就稱爲最小割,也就是圖割的結果。而福特-富克森定理表明,網路的最大流max flow與最小割min cut相等。所以由BoykovKolmogorov發明的max-flow/min-cut算法就可以用來獲得s-t圖的最小割。這個最小割把圖的頂點劃分爲兩個不相交的子集ST,其中s St TST=V 。這兩個子集就對應於圖像的前景像素集和背景像素集,那就相當於完成了圖像分割。

        也就是說圖中邊的權值就決定了最後的分割結果,那麼這些邊的權值怎麼確定呢?

       圖像分割可以看成pixel labeling(像素標記)問題,目標(s-node)的label設爲1,背景(t-node)的label設爲0,這個過程可以通過最小化圖割來最小化能量函數得到。那很明顯,發生在目標和背景的邊界處的cut就是我們想要的(相當於把圖像中背景和目標連接的地方割開,那就相當於把其分割了)。同時,這時候能量也應該是最小的。假設整幅圖像的標籤label(每個像素的label)爲L= {l1,l2,,,, lp },其中li0(背景)或者1(目標)。那假設圖像的分割爲L時,圖像的能量可以表示爲:

E(L)=aR(L)+B(L)

       其中,R(L)爲區域項(regional term),B(L)爲邊界項(boundary term),而a就是區域項和邊界項之間的重要因子,決定它們對能量的影響大小。如果a0,那麼就只考慮邊界因素,不考慮區域因素。E(L)表示的是權值,即損失函數,也叫能量函數,圖割的目標就是優化能量函數使其值達到最小。

區域項:

,其中Rp(lp)表示爲像素p分配標籤lp的懲罰,Rp(lp)能量項的權值可以通過比較像素p的灰度和給定的目標和前景的灰度直方圖來獲得,換句話說就是像素p屬於標籤lp的概率,我希望像素p分配爲其概率最大的標籤lp,這時候我們希望能量最小,所以一般取概率的負對數值,故t-link的權值如下:

Rp(1) = -ln Pr(Ip|’obj’) Rp(0) = -ln Pr(Ip|’bkg’)

        由上面兩個公式可以看到,當像素p的灰度值屬於目標的概率Pr(Ip|’obj’)大於背景Pr(Ip|’bkg’),那麼Rp(1)就小於Rp(0),也就是說當像素p更有可能屬於目標時,將p歸類爲目標就會使能量R(L)小。那麼,如果全部的像素都被正確劃分爲目標或者背景,那麼這時候能量就是最小的。

邊界項:

        其中,pq爲鄰域像素,邊界平滑項主要體現分割L的邊界屬性,B<p,q>可以解析爲像素pq之間不連續的懲罰,一般來說如果pq越相似(例如它們的灰度),那麼B<p,q>越大,如果他們非常不同,那麼B<p,q>就接近於0。換句話說,如果兩鄰域像素差別很小,那麼它屬於同一個目標或者同一背景的可能性就很大,如果他們的差別很大,那說明這兩個像素很有可能處於目標和背景的邊緣部分,則被分割開的可能性比較大,所以當兩鄰域像素差別越大,B<p,q>越小,即能量越小。(雖然和公式是吻合的,但是是不是不太對勁啊,不一樣怎麼能能量小呢???? )

        好了,現在我們來總結一下:我們目標是將一幅圖像分爲目標和背景兩個不相交的部分,我們運用圖分割技術來實現。首先,圖由頂點和邊來組成,邊有權值。那我們需要構建一個圖,這個圖有兩類頂點,兩類邊和兩類權值。普通頂點由圖像每個像素組成,然後每兩個鄰域像素之間存在一條邊,它的權值由上面說的“邊界平滑能量項”來決定。還有兩個終端頂點s(目標)和t(背景),每個普通頂點和s都存在連接,也就是邊,邊的權值由“區域能量項”Rp(1)來決定,每個普通頂點和t連接的邊的權值由“區域能量項”Rp(0)來決定。這樣所有邊的權值就可以確定了,也就是圖就確定了。這時候,就可以通過min cut算法來找到最小的割,這個min cut就是權值和最小的邊的集合,這些邊的斷開恰好可以使目標和背景被分割開,也就是min cut對應於能量的最小化。而min cut和圖的max flow是等效的,故可以通過max flow算法來找到s-t圖的min cut。目前的算法主要有:

1) Goldberg-Tarjan

2) Ford-Fulkerson

3) 上述兩種方法的改進算法

 

權值:

         Graph cut3x3圖像分割示意圖:我們取兩個種子點(就是人爲的指定分別屬於目標和背景的兩個像素點),然後我們建立一個圖,圖中邊的粗細表示對應權值的大小,然後找到權值和最小的邊的組合,也就是(c)中的cut,即完成了圖像分割的功能。

上面具體的細節請參考:

Interactive Graph Cuts for Optimal Boundary & Region Segmentation of Objects in N-D Images》(Boykoviccv01)這篇paper講怎麼用graphcut來做image segmentation

Boykov Kolmogorov 倆人的主頁上就有大量的code。包括maxflow/min-cutstereo algorithms等算法:

http://pub.ist.ac.at/~vnk/software.html

http://vision.csd.uwo.ca/code/

康奈爾大學的graphcuts研究主頁也有不少信息:

http://www.cs.cornell.edu/~rdz/graphcuts.html

Image Segmentation: A Survey of Graph-cut Methods》(Faliu YiICSAI 2012

 

圖像分割之(三)從Graph Cut到Grab Cut

[email protected]

http://blog.csdn.net/zouxy09

 

      上一文對GraphCut做了一個瞭解,而現在我們聊到的GrabCut是對其的改進版,是迭代的Graph CutOpenCV中的GrabCut算法是依據《"GrabCut" - Interactive Foreground Extraction using Iterated Graph Cuts》這篇文章來實現的。該算法利用了圖像中的紋理(顏色)信息和邊界(反差)信息,只要少量的用戶交互操作即可得到比較好的分割結果。那下面我們來了解這個論文的一些細節。另外OpenCV實現的GrabCut的源碼解讀見下一個博文。接觸時間有限,若有錯誤,還望各位前輩指正,謝謝。

        GrabCut是微軟研究院的一個課題,主要功能是分割和摳圖。個人理解它的賣點在於:

1)你只需要在目標外面畫一個框,把目標框住,它就可以完成良好的分割:

2)如果增加額外的用戶交互(由用戶指定一些像素屬於目標),那麼效果就可以更完美:


3)它的Border Matting技術會使目標分割邊界更加自然和perfect

       當然了,它也有不完美的地方,一是沒有任何一個算法可以放之四海而皆準,它也不例外,如果背景比較複雜或者背景和目標相似度很大,那分割就不太好了;二是速度有點慢。當然了,現在也有不少關於提速的改進。

         OK,那看了效果,我們會想,上面這些效果是怎麼達到的呢?它和Graph Cut有何不同?

1Graph Cut的目標和背景的模型是灰度直方圖,Grab Cut取代爲RGB三通道的混合高斯模型GMM

2Graph Cut的能量最小化(分割)是一次達到的,而Grab Cut取代爲一個不斷進行分割估計和模型參數學習的交互迭代過程;

3Graph Cut需要用戶指定目標和背景的一些種子點,但是Grab Cut只需要提供背景區域的像素集就可以了。也就是說你只需要框選目標,那麼在方框外的像素全部當成背景,這時候就可以對GMM進行建模和完成良好的分割了。即Grab Cut允許不完全的標註(incomplete labelling)。

 

1、顏色模型

       我們採用RGB顏色空間,分別用一個K個高斯分量(一取般K=5)的全協方差GMM(混合高斯模型)來對目標和背景進行建模。於是就存在一個額外的向量k = {k1, . . ., kn, . . ., kN},其中kn就是第n個像素對應於哪個高斯分量,kn {1, . . . K}。對於每個像素,要不來自於目標GMM的某個高斯分量,要不就來自於背景GMM的某個高斯分量。

所以用於整個圖像的Gibbs能量爲(式7):

       其中,U就是區域項,和上一文說的一樣,你表示一個像素被歸類爲目標或者背景的懲罰,也就是某個像素屬於目標或者背景的概率的負對數。我們知道混合高斯密度模型是如下形式:

       所以取負對數之後就變成式(9)那樣的形式了,其中GMM的參數θ就有三個:每一個高斯分量的權重π、每個高斯分量的均值向量u(因爲有RGB三個通道,故爲三個元素向量)和協方差矩陣(因爲有RGB三個通道,故爲3x3矩陣)。如式(10)。也就是說描述目標的GMM和描述背景的GMM的這三個參數都需要學習確定。一旦確定了這三個參數,那麼我們知道一個像素的RGB顏色值之後,就可以代入目標的GMM和背景的GMM,就可以得到該像素分別屬於目標和背景的概率了,也就是Gibbs能量的區域能量項就可以確定了,即圖的t-link的權值我們就可以求出。那麼n-link的權值怎麼求呢?也就是邊界能量項V怎麼求?

       邊界項和之前說的Graph Cut的差不多,體現鄰域像素mn之間不連續的懲罰,如果兩鄰域像素差別很小,那麼它屬於同一個目標或者同一背景的可能性就很大,如果他們的差別很大,那說明這兩個像素很有可能處於目標和背景的邊緣部分,則被分割開的可能性比較大,所以當兩鄰域像素差別越大,能量越小。而在RGB空間中,衡量兩像素的相似性,我們採用歐式距離(二範數)。這裏面的參數β由圖像的對比度決定,可以想象,如果圖像的對比度較低,也就是說本身有差別的像素mn,它們的差||zm-zn||還是比較低,那麼我們需要乘以一個比較大的β來放大這種差別,而對於對比度高的圖像,那麼也許本身屬於同一目標的像素mn的差||zm-zn||還是比較高,那麼我們就需要乘以一個比較小的β來縮小這種差別,使得V項能在對比度高或者低的情況下都可以正常工作。常數γ爲50(經過作者用15張圖像訓練得到的比較好的值)。OK,那這時候,n-link的權值就可以通過式(11)來確定了,這時候我們想要的圖就可以得到了,我們就可以對其進行分割了。

 

2、迭代能量最小化分割算法

        Graph Cut的算法是一次性最小化的,而Grab Cut是迭代最小的,每次迭代過程都使得對目標和背景建模的GMM的參數更優,使得圖像分割更優。我們直接通過算法來說明:

2.1、初始化
1)用戶通過直接框選目標來得到一個初始的trimap T,即方框外的像素全部作爲背景像素TB,而方框內TU的像素全部作爲“可能是目標”的像素。

2)對TB內的每一像素n,初始化像素n的標籤αn=0,即爲背景像素;而對TU內的每個像素n,初始化像素n的標籤αn=1,即作爲“可能是目標”的像素。

3)經過上面兩個步驟,我們就可以分別得到屬於目標(αn=1)的一些像素,剩下的爲屬於背景(αn=0)的像素,這時候,我們就可以通過這個像素來估計目標和背景的GMM了。我們可以通過k-mean算法分別把屬於目標和背景的像素聚類爲K類,即GMM中的K個高斯模型,這時候GMM中每個高斯模型就具有了一些像素樣本集,這時候它的參數均值和協方差就可以通過他們的RGB值估計得到,而該高斯分量的權值可以通過屬於該高斯分量的像素個數與總的像素個數的比值來確定。

2.2、迭代最小化

1)對每個像素分配GMM中的高斯分量(例如像素n是目標像素,那麼把像素nRGB值代入目標GMM中的每一個高斯分量中,概率最大的那個就是最有可能生成n的,也即像素n的第kn個高斯分量):

2)對於給定的圖像數據Z,學習優化GMM的參數(因爲在步驟(1)中我們已經爲每個像素歸爲哪個高斯分量做了歸類,那麼每個高斯模型就具有了一些像素樣本集,這時候它的參數均值和協方差就可以通過這些像素樣本的RGB值估計得到,而該高斯分量的權值可以通過屬於該高斯分量的像素個數與總的像素個數的比值來確定。):

3)分割估計(通過1中分析的Gibbs能量項,建立一個圖,並求出權值t-linkn-link,然後通過max flow/min cut算法來進行分割):

4)重複步驟(1)到(3),直到收斂。經過(3)的分割後,每個像素屬於目標GMM還是背景GMM就變了,所以每個像素的kn就變了,故GMM也變了,所以每次的迭代會交互地優化GMM模型和分割結果。另外,因爲步驟(1)到(3)的過程都是能量遞減的過程,所以可以保證迭代過程會收斂。

5)採用border matting對分割的邊界進行平滑等等後期處理。

2.3、用戶編輯(交互)

1)編輯:人爲地固定一些像素是目標或者背景像素,然後再執行一次2.2中步驟(3);

2)重操作:重複整個迭代算法。(可選,實際上這裏是程序或者軟件摳圖的撤銷作用)

 

       總的來說,其中關鍵在於目標和背景的概率密度函數模型和圖像分割可以交替迭代優化的過程。更多的細節請參考原文。

《“GrabCut” — Interactive Foreground Extraction using Iterated Graph Cuts

http://research.microsoft.com/en-us/um/people/ablake/papers/ablake/siggraph04.pdf

 

        OpenCV實現了這個算法(沒有後面的border matting過程),下一文我們再解讀下它的源代碼。

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