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個區域。其中一個區域代表所需分割目標上的一個像素位置,另一個為背景上的一個像素位置。有了能量函數的定義和初始的終端頂點,就可以采用圖割理論來不斷迭代對目標進行分割了。
參考資料:
http://en.wikipedia.org/wiki/Graph_cuts_in_computer_vision
http://www.cnblogs.com/longdouhzt/archive/2012/05/11/2496373.html
[基礎算法] Graph Cut and Its Application in Computer Vision
[論文筆記] CUDA Cuts: Fast Graph Cuts on the GPU
Boykov, Y. Y. and M. P. Jolly (2001). Interactive graph cuts for optimal boundary & region segmentation of objects in ND images. Computer Vision, 2001. ICCV 2001. Proceedings. Eighth IEEE International Conference on, IEEE.