1. 程式人生 > >影象分割之最小割與最大流演算法

影象分割之最小割與最大流演算法

摘要:影象分割中”Graph Cut”、”Grab Cut”等方法都有使用到最小割演算法。網上資料介紹了Graph cut和Grab cut中圖的構建方法,但對最小割的求解一筆帶過。所以萌生了寫一篇介紹圖的最小割和最大流的部落格的想法。

關鍵字:影象處理, 最小割, 最大流, 影象分割

1. 題外話

圖的最小割和最大流問題是圖論中比較經典的問題,也是各大演算法競賽中經常出現的問題。影象分割中”Graph Cut”、”Grab Cut”等方法都有使用到最小割演算法。網上資料介紹了Graph cut和Grab cut中圖的構建方法,但對最小割的求解一筆帶過。所以萌生了寫一篇介紹圖的最小割和最大流的部落格。

2. 關於最小割(min-cut)

假設大家對圖論知識已經有一定的瞭解。如圖1所示,是一個有向帶權圖,共有4個頂點和5條邊。每條邊上的箭頭代表了邊的方向,每條邊上的數字代表了邊的權重。

G = < V, E >是圖論中對圖的表示方式,其中V表示頂點(vertex)所構成的集合,E表示邊(edge)所構成的集合。頂點V的集合和邊的集合E構成了圖G(graph)。

圖1

那什麼是最小割呢?

以圖1為例,圖1中頂點s表示源點(source),頂點t表示終點(terminal),從源點s到終點t共有3條路徑:

  • s -> a -> t
  • s -> b -> t
  • s -> a -> b-> t

現在要求剪短圖中的某幾條邊,使得不存在從s到t的路徑,並且保證所減的邊的權重和最小。相信大家能很快想到解答:剪掉邊”s -> a”和邊”b -> t”。

剪完以後的圖如圖2所示。此時,圖中已不存在從s到t的路徑,且所修剪的邊的權重和為:2 + 3 = 5,為所有修剪方式中權重和最小的。

我們把這樣的修剪稱為最小割。

圖2

3. 關於最大流(max-flow)

什麼是最大流呢?

繼續以圖1為例,假如頂點s源源不斷有水流出,邊的權重代表該邊允許通過的最大水流量,請問頂點t流入的水流量最大是多少?

從頂點s到頂點t的3條路徑著手分析,從源點s到終點t共有3條路徑:

  • s -> a -> t:流量被邊”s -> a”限制,最大流量為2
  • s -> b -> t:流量被邊”b -> t”限制,最大流量為3
  • s -> a -> b-> t:邊”s -> a”的流量已經被其他路徑佔滿,沒有流量

所以,頂點t能夠流入的最大水流量為:2 + 3 = 5。

這就是最大流問題。所以,圖1的最大流為:2 + 3 = 5。

細心的你可能已經發現:圖1的最小割和最大流都為5。是的,經過數學證明可以知道,圖的最小割問題可以轉換為最大流問題。所以,演算法上在處理最小割問題時,往往先轉換為最大流問題。

那如何憑直覺解釋最小割和最大流存在的這種關係呢?借用Jecvy部落格的一句話:1.最大流不可能大於最小割,因為最大流所有的水流都一定經過最小割那些割邊,流過的水流怎麼可能比水管容量還大呢? 2.最大流不可能小於最小割,如果小,那麼說明水管容量沒有物盡其用,可以繼續加大水流。

4. 最大流的求解

現在我們已經知道了最小割和最大流之間的關係,也理解了最小割問題往往先轉換為最大流問題進行求解。那麼,如何有效求解最大流問題呢?

事實上,我並不打算自己再把最大流演算法講解一遍,因為最大流演算法很容易在搜尋引擎上搜索到。我真正要講的是下面的部分,關於如何把最大流的結果轉換到最小割。

5. 如何把最大流的結果轉換為最小割

網上介紹最小割和最大流往往介紹完最大流的求解方法後就不繼續講解了,我上面貼出的兩篇部落格都存在這個問題。這樣大家肯定會有個疑惑:如何把最大流的結果轉換為最小割。

我以上面貼出的Ford-Fulkerson演算法的部落格的結果為例講解下如何轉換。如圖3是最大流求解演算法的最終結果。邊上的數字“@/#”表示這條邊最大流量為#,在最大流求解演算法中該邊所使用的流量為@。比如邊“13/15”表示該邊最大能容納的流量為15,但在最大流求解演算法中使用到的流量為13。

圖3

我們把流量已經佔滿的所有邊去掉,得到圖4:

圖4

此時,在圖4中,以頂點s為起點進行圖遍歷(遍歷的方法可以選擇BFS廣度優先遍歷)。遍歷結束後,可以得到遍歷經過的所有點:S、B、C、D。

有些沒學過圖遍歷的小夥伴可以這樣理解:從頂點s出發,最多能經過哪些點。那麼,很顯然,最多能經過S、B、C、D這幾個點。只不過人腦回答這個問題比較簡單,但計算機需要特定的演算法來解答,也就是上一段所說的”圖遍歷演算法”。

這樣,把S、B、C、D構成一個子圖(圖4中紫色部分),其他的點A、E、F、t構成另一個子圖(圖4中黃色部分)。連線兩個子圖的邊有兩種情況:

  • 已被佔滿的前向邊:s -> A, B -> E, D -> t
  • 沒有流量的反向邊:A -> B, E -> D

其中“已被佔滿的前向邊”就是我們要求的最小割。對於圖4來說,就是”s -> A”、”B -> E”、”D -> t”這3條邊。

6. 如何將最小割方法應用到影象分割中

寫這篇有關最小割的部落格,其實是為了給下一篇部落格做鋪墊。下一篇部落格將介紹Graph cut、Grab cut等演算法是如何利用最小割來實現影象分割的。

相關推薦

影象分割演算法

摘要:影象分割中”Graph Cut”、”Grab Cut”等方法都有使用到最小割演算法。網上資料介紹了Graph cut和Grab cut中圖的構建方法,但對最小割的求解一筆帶過。所以萌生了寫一篇介紹圖的最小割和最大流的部落格的想法。 關鍵字:影象處

(Mincut & Maxflow)

這裡先介紹mincut和maxflow,為介紹Grabcut打下基礎。Grabcut可以用在影象分割和文字二值化中。 1 首先介紹Mincut問題。 這部分內容主要翻譯自[1],可以看原版理解的更深.由於個人沒有看過中文教材,因此可能一些專業術語翻譯的不

對偶圖

對偶圖是一種神奇的東西! 對於一個平面圖\(G=(V,E)\)(也就是能畫在平面上,且邊的交點都在頂點處的圖),則它的對偶圖\(G^*\)的定義如下: 1.\(G^*\)的每一個頂點對應\(G\)中的每一個面 2.對於\(G\)中的邊\(e\),若它的兩側為兩個不同的平面\(f_1^*\)和\(f_2^*\)

ZOJ 3792 Romantic Value 費用下邊數)

post algorithm tracking anti can fine ini eof clu 求最小割及最小花費 把邊權c = c*10000+1 然後跑一個最小割,則flow / 10000就是費用 flow%10000就是邊數。 且是邊數最少

2017青島賽區網絡賽 Smallest Minimum Cut 求邊數

ext size 完整 bool minimum nbsp 網絡賽 else include 先最大流跑一遍 在殘存網絡上把滿流邊容量+1 非滿流邊容量設為無窮大 在進行一次最大流即可 (這裏的邊都不包括建圖時用於反悔的反向邊) 1 #include<cstdi

BZOJ1001: [BeiJing2006]狼抓兔子 (短路)

pty closed bsp ini 分割 pan void define 最短 淺析最大最小定理在信息學競賽中的應用---周東 ↑方法介紹 對於一個聯通的平面圖G(滿足歐拉公式) 在s和t間新連一條邊e; 然後建立一個原圖的對偶圖G*,G*中每一個點對應原圖中每一個面,每

bzoj2229: [Zjoi2011](分治+樹思想)

flow n) www. 一道 兩個 urn 定義 mem ... 2229: [Zjoi2011]最小割 題目:傳送門 題解:    一道非常好的題目啊!!!    蒟蒻的想法:暴力枚舉點對跑最小割記錄...絕對爆炸啊....    開始懷疑是不是題目騙人..

BZOJ1565 NOI 2009 植物大戰僵屍 topo+大權閉合子圖)

front 總結 algorithm str ring eof 而是 OS mat 題目鏈接:https://www.luogu.org/problemnew/show/P2805(bzoj那個實在是有點小小的辣眼睛。。。我就把洛谷的丟出來吧。。。) 題意概述:給出一張

分治(樹):BZOJ2229 && BZOJ4519

std pri mem i++ while == return int urn 定理:n個點的無向圖的最小割最多n-1個。 可能從某種形式上形成了一棵樹,不是很清楚。 最小割分治:先任選兩個點求一邊最小割,然後將兩邊分別遞歸,就能找到所有的最小割。 這兩個題是一樣的,

網絡——大權閉合子圖

opened span pop 最大的 RM div eof 分享圖片 LV 定義 有一個有向圖,每一個點都有一個權值(可以為正或負或0),選擇一個權值和最大的子圖,使得每個點的後繼都在子圖裏面,這個子圖就叫最大權閉合子圖。 如下圖: 能選的子圖有?,{4},{3,4},

BZOJ1001 [BeiJing2006]狼抓兔子 平面圖轉對偶圖,短路

bits ges code inf 如果 對偶圖 += ron oid 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 28885 Solved: 7540[Submit

bzoj1797: [Ahoi2009]Mincut (網絡,縮點)

inline 縮點 php har sin ext 集中 git 我們 傳送門   首先肯定要跑一個最小割也就是最大流   然後我們把殘量網絡tarjan,用所有沒有滿流的邊來縮點   一條邊如果沒有滿流,那它就不可能被割了   一條邊如果所屬的兩個強聯通分量不同,

【BZOJ2229】[ZJOI2011](網絡樹)

geo com ext pop != names pro truct str 【BZOJ2229】[ZJOI2011]最小割(網絡流,最小割樹) 題面 BZOJ 洛谷 題解 戳這裏 那麽實現過程就是任選兩點跑最小割更新答案,然後把點集劃分為和\(S\)聯通以及與\(T\)聯

CF1082G Petya and Graph(大權閉合子圖)

題目連結 QWQ嚶嚶嚶 感覺是最水的一道 G G G題了 順便記錄一下第

java中不使用比較運算子,求兩個數的

通常來說,求兩個數的最大值與最小值,最常用的方法是比較大小。下面給出一種不需要比較大小就可以求出兩個數中的最大值與最小值的方法,該方法用到了一種巧妙的數學方法。 即: 最大值:Max(a,b)=(a+b+|a-b|)/2, 最小值:Min(a,b)=(a+b-|

[bzoj2229][Zjoi2011]_網絡_

memset void 等於 geo == else 並且 bzoj 取出 最小割 bzoj-2229 Zjoi-2011 題目大意:題目鏈接。 註釋:略。 想法: 在這裏給出最小割樹的定義。 最小割樹啊,就是這樣一棵樹。一個圖的最小割樹滿足這棵樹上任意兩點之

HDU 6214 Smallest Minimum Cut (邊)(兩種演算法的分析)

Problem Description Consider a network G=(V,E) with source s and sink t. An s-t cut is a partition of nodes set V into two parts s

poj 1815 Friendship 輸出方案

這題卡了好久啊,最小割模型很容易想,拆點就行。就像poj的Thieves一樣 每個點 a拆成 a->a',容量為1。 其他相連的點 a'->b ,容量為INF 源連線s',t連線匯 問題在於輸出最小的割集 更好的方法我還不會,只能列舉。 這裡基於貪心的思想,從

平面圖的短路(點非常多)

/************************************************************** User: error408 Language: C/C++ School: SSDUT Saying: Do one thing at a time

P4177 [CEOI2008]order 網絡大權閉合子圖

problem pre cli www 最大 同時 oid pan org 題目鏈接 \(Click\) \(Here\) 如果沒有租用機器就是一個裸的最大權閉合子圖。現在有了租用機器應該怎麽辦呢? 單獨拆點是不行的,因為會和直接買下的情況脫離關系,租借是和連邊直接相關的,