1. 程式人生 > >Graph Cuts初步理解

Graph Cuts初步理解

  Graph cuts是一種十分有用和流行的能量優化演算法,在計算機視覺領域普遍應用於前背景分割(Image segmentation)、立體視覺(stereo vision)、摳圖(Image matting)等。Graph Cuts理論最早是出現在流網路優化領域的,比如說水管網路,通訊傳輸網路,城市車流網路等。此時的Graph Cuts演算法是用來確定網路流的最小分割,即尋找一個容量最小的邊的集合,去掉這個集合中的所有邊就可以阻擋這個網路了。需要注意的是,通常所說的Graph Cuts演算法是指的採用最大流-最小分割來優化的模型,其它的Graph Cutting演算法一般用graph partitioning這個名詞來代替。

  首先還得先理解Graph Cuts中的Graph和Cuts的意思。此處的Graph和普通的Graph稍有不同。普通的圖由頂點和邊構成,如果邊的有方向的,這樣的圖被則稱為有向圖,否則為無向圖,且邊是有權值的,不同的邊可以有不同的權值,分別代表不同的物理意義。而Graph Cuts圖是在普通圖的基礎上多了2個頂點,這2個頂點分別用符號”S”和”T”表示,統稱為終端頂點。其它所有的頂點都必須和這2個頂點相連形成邊集合中的一部分。所有Graph Cuts中的邊也分為兩種,一種是普通頂點與相鄰點或者與之有關聯的點之間的連線,一種是剛講的普通頂點和2個終端頂點之間的連線。 Graph Cuts中的Cuts是指這樣一個邊的集合,很顯然這些邊集合包括了上面2種邊,該集合中邊的斷開會導致殘留”S”和”T”圖的分開,且這些邊的集合中所有權值之和是最小的。因此也稱為最小割。關於Graph Cuts的示意圖如下所示:

  

  圖割在影象分割中應用得很廣,那麼應該怎樣將圖割理論和計算機視覺聯絡起來呢?圖割模型和影象該怎麼建立聯絡呢?有一位網友在他的博文圖割小結做了個小結,比喻得還不錯,可以讓大家圖割在影象分割中的作用有個初步的印象。

  在參考了iccv2001的文章Interactive graph cuts for optimal boundary & region segmentation of objects in ND images後,或許能夠找到上述問題的一點答案。首先,一張image可以看作是一個矩陣,圖中的每個畫素就是矩陣中的一個位置,這個畫素可以看做是圖中的一個頂點。然後我們把相鄰頂點之間用短線(有向或無向都行)連線起來,這就形成了邊,現在這幅image有頂點和邊了,也就構成一幅Graph了。至於邊的權值怎麼計算,則是很理論的東西。看了下論文中的解釋,影象中邊的權值一般由2部分構成,平滑項和資料項,這2部分的比重用1個係數來平衡,其中平滑項主要體現頂點畫素和其相鄰區域畫素之間值的變化強度,如果變化劇烈說明這兩者很有可能出於邊緣部分,則被分割開的可能性比較大,而按照最小割的分割原理,這時2者的平滑項權值應該較小。而資料項部分則表示對應頂點屬於前景或者背景的懲罰項。其論文中的數學公式為:

  

 

  其中R(A)表示的是區域資料項,B(A)表示的是邊界平滑項,E(A)表示的是權值,即損失函式,也叫能量函式,圖割的目標就是優化能量函式使其值達到最小。

  另外由於Graph Cuts需要有2個終端節點”S”和”T”,分別表示初始的目標區域和背景區域,在計算機視覺的影象分割領域時,需要人工指定初始的s頂點和t頂點,如果有HCI的話,可以用滑鼠分別直接點這2個區域。其中一個區域代表所需分割目標上的一個畫素位置,另一個為背景上的一個畫素位置。有了能量函式的定義和初始的終端頂點,就可以採用圖割理論來不斷迭代對目標進行分割了。