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


zouxy09@qq.com

http://blog.csdn.net/zouxy09

上一文對主要的分割方法做了一個概述。那下面我們對其中幾個比較感興趣的算法做個學習。下面主要是Graph Cut,下一個博文我們再學習下Grab Cut,兩者都是基於圖論的分割方法。另外OpenCV實現了Grab Cut,具體的源碼解讀見博文更新。接觸時間有限,若有錯誤,還望各位前輩指正,謝謝。

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

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

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

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

clip_image001

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

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

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

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

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

clip_image009

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

區域項:

clip_image011

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

clip_image017

由上面兩個公式可以看到,當像素p的灰度值屬於目標的概率clip_image019大於背景clip_image021,那么clip_image023就小於clip_image025,也就是說當像素p更有可能屬於目標時,將p歸類為目標就會使能量R(L)小。那么,如果全部的像素都被正確划分為目標或者背景,那么這時候能量就是最小的。

邊界項:

clip_image027
clip_image029
clip_image031

其中,pq為鄰域像素,邊界平滑項主要體現分割L的邊界屬性,clip_image033可以解析為像素pq之間不連續的懲罰,一般來說如果pq越相似(例如它們的灰度),那么clip_image033[1]越大,如果他們非常不同,那么clip_image033[2]就接近於0。換句話說,如果兩鄰域像素差別很小,那么它屬於同一個目標或者同一背景的可能性就很大,如果他們的差別很大,那說明這兩個像素很有可能處於目標和背景的邊緣部分,則被分割開的可能性比較大,所以當兩鄰域像素差別越大,clip_image033[3]越小,即能量越小。

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

1) Goldberg-Tarjan

2) Ford-Fulkerson

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

權值:

clip_image039

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

clip_image041

上面具體的細節請參考:

《Interactive Graph Cuts for Optimal Boundary & Region Segmentation of Objects in N-D Images》(Boykov,iccv01)這篇paper講怎么用graphcut來做image segmentation。

在Boykov 和 Kolmogorov 倆人的主頁上就有大量的code。包括maxflow/min-cut、stereo 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 Yi,ICSAI 2012)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM