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

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

[email protected]

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,其中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

發佈了270 篇原創文章 · 獲贊 208 · 訪問量 136萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章