1. 程式人生 > >最小割與最大流(Mincut & Maxflow)

最小割與最大流(Mincut & Maxflow)

這裡先介紹mincutmaxflow,為介紹Grabcut打下基礎。Grabcut可以用在影象分割和文字二值化中。

首先介紹Mincut問題

這部分內容主要翻譯自[1],可以看原版理解的更深.由於個人沒有看過中文教材,因此可能一些專業術語翻譯的不太對,敬請見諒。

一個有向圖,並有一個源頂點(source vertex)和目標頂點(target vertex.邊的權值為正,又稱之為容量(capacity.如下圖

一個st-cut(簡稱割cut)會把有向圖的頂點分成兩個不相交的集合,其中s在一個集合中,t在另外一個集合中(在影象分割中,你可以將s理解成前景,t理解成背景)。

這個割的容量(capacity of the cut就是AB所有邊的容量和。注意這裡不包含BA。參見下面幾幅圖。最小割問題就是要找到割容量最小的情況

可以想象成某某國家要控制網路,使得國民不能跟外面聯絡,S代表某個國家,t代表其餘的世界。而每條邊上代表著是頻寬,頻寬越大,肯定建設成本也越大,在進行cut的時候當然希望能達到完全斷開的效果但又能破壞越少的基建設施,這就是最小割問題。

2 Maxflow

接著介紹maxflow問題。跟mincut問題類似,maxflow要處理的情況也是一個有向圖,並有一個原頂點(source vertex)和目標(target vertex

.邊的權值為正,又稱之為容量(capacity.如下圖

一個st-flow(簡稱flow)是為每條邊附一個值,這個值需要滿足兩個條件

1  0<=邊的flow <<邊的capacity

除了st外,每個頂點的inflow要等於outflow

見下圖,其實這個很好理解,可以想象成水管或者電流。

一個flow的值(value of the flow)就是tinflow.Maxflow就是找到這個最大值

後面會發現Mincutmaxflow的問題是對偶的,解出了maxflow也就知道了mincut的解。

現在先介紹一種解maxflow

的演算法Ford-Fulkerson,為了方便,簡稱FF演算法。

1)初始化,所有邊的flow都初始化為0

2)沿著增廣路徑增加flow。增廣路徑是一條從st的無向路徑,但也有些條件,可以經過沒有滿容量的前向路徑(st)或者是不為空的反向路徑(t->s)

opencv用的是文獻[2]的演算法。這裡先不做介紹。

3 maxflow-mincut理論證明對偶性(optional

首先定義一個概念net flow,經過一個割cut(A,B)net flow等於從AB的邊flow的和減去從BAflow的和。

然後我們就有了flow-value引理f為任意的流,(A,B)為任意的割,那麼f的值 value of flow(也就是tinflow)等於經過(A,B)的netflow.

如下圖,value offlow = 8+9+10 = 27 , 而割的net flow = 8+2+7-2+12 = 27.要證明這個引理可以用數學歸納法。

Weak duality(弱對偶)f為任意的流,(AB)為任意的割,那麼Valueof flow <= capacity of cut(A,B)

因為cut(A,B)等於從AB流量,而value offlow等於cutAB)的netflow,還得減去從BA邊的流量。

那麼現在我們可以引出兩個定理:

增廣路徑定理(Augmenting Path theorem:一個流f是最大流當且僅當沒有增廣路徑。

最小割最大流定理(Maxflow-mincut theorem:Maxflow的值等於最小割的容量。

要證明上面的定理,只要證明下面三個條件是等價的就可以了:

1)存在一個割的容量等於flow f的值

2f是最大流

3)對於f沒有增廣路徑

首先我們證明(1->2。假設我們有一個割(A,B)的容量等於f的值,那麼利用弱對偶的關係,其他流的值<=(A,B)的容量,而由於1的假設,(AB)的容量等於f的值,因此得到其他流的值都小於f的值,從而(2)成立

接著證明(2->(3)。我們來證明它的逆否命題。對於f如果還有還有增廣路徑,那f不是最大流,這很顯然,如果按照FF演算法的話,我們還可以增加flow f的值,因此f就不會是最大流,因此逆否命題成立,也就代表(2->(3)成立。

最後證明從(3->(1)。讓割(A,B)滿足這麼一個條件:sA中,且A中的頂點通過一些無向的邊連線而成,這些邊要麼是不是滿的前向邊要麼是非空的反向邊。如下圖中加粗的邊。

那麼根據定義,sA中,由於沒有增廣路徑,因此tB中。

由於這個割的BA的邊流量全是0

這個割的容量沿著這個割的netflow(AB邊的流量-BA邊的流量)

又根據flow-value引理,netflow = value of low,因此推出(1.

最後我們怎麼根據最大流的解得到最小割的解呢,就是和證明(3->(1)中的一樣讓割(A,B)滿足這麼一個條件:sA中,且A中的頂點通過一些無向的邊連線而成,這些邊要麼是不是滿的前向邊要麼是非空的反向邊

[2]An Experimental Comparison ofMin-Cut/Max-Flow Algorithms forEnergy Minimization in Vision