本篇主要介紹matlab實現Max-flow/min-cut的方法,介紹一種只實現了Max-flow/min-cut的工具箱Bk_matlab。

一:最大流最小割的由來

了解這個問題之前先說說這個問題的由來吧。最大流最小割最開始從圖論的相關概念中引用過來,講述一個帶有起點與終點並且具有邊權值的網絡圖中,如何進行邊的切割,把這個網絡圖分成獨立的兩個部分(或者多個部分),使得這個切割中被切割的邊的權值之和最小。比如現在有一個網絡圖如下:

那么要把這個圖分割成兩部分,如上的虛線就是一種切割方式,這個時候可以看到這種切割下消耗的邊的權值為3+4=7吧,當然,切割的方式很多種,不同的切割方式自然對應不同的切割邊權值,而最大流最小割就是找到一種切割方式使得切割的邊的權值之和最小。

這么一看似乎也看不出它的實際意義所在,最大流最小割應該說是應用還挺好的,一個重要應用就在於對圖像的分割上面。

先了解一下圖像的分割,隨便對於一副圖像,很容易把圖像分成若干部分的,常見的圖像分割算法有Kmeans,FCM,馬爾科夫,等等很多。我們知道,圖像簡單來說就是矩陣,對於只是灰度圖像,那么就是一般的二維矩陣,矩陣中值的大小就是該點的灰度值,那么圖像分割問題就是尋找到圖像的邊界,而邊界肯定在兩個像素值差別很大的鄰域間,如果把兩個鄰域間的像素值差定義為該鄰域的邊權值的話,分割問題就轉化為如何切割這些邊的問題了,這樣模型就和上述的對應上了,有點,有邊,有邊的權值,那么就可以運用上述理論解決圖的分割問題了。

在形象一點如下所示:

那么這就是一個對圖像的分割。

理論介紹的不夠好,貼一些其他關於最大流最小割的介紹性文章:

最大流/最小割算法總結

二:關於圖割理論

在正式使用之前先介紹下關於圖割理論用來分割圖像的方法。還是先貼些比較好的別人寫的文章:

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

這里面理論化介紹的都是直觀上的對圖像的操作,而在實際變成實現的時候是要事先轉化到一維或者直接調用相應的函數才能對二維的圖像進行操作。我們先介紹對一維的圖割操作,后面再介紹二維是如何轉化到一維的。

那么對於一個圖割問題,需要明確的由一下幾點:

1):源點s與匯點t

如下圖所示的由五個點site組成的一維情況,假設最終我們要分成兩類,那么就把這兩類認為是源點s與匯點t好了,那么一次類推,如果要分成多個類的話,就可以加相應的節點s或者t表示他們的類就可以了。

2):點與點之間的權值Smoothcost

從下圖上也可以看出在這個一維點與點之間相連接的權值就是Smoothcost項,圖中為了簡化只是畫出了相鄰的兩個點之間有一條線連接,也就是他們之間存在着權值(這里圖為一個無向圖,也就是權值是沒有方向之分的),正常情況下,可能每兩個點之間都可能存在着聯系,比如如果點1與點3之間,你也可以看成他們是連接的,只不過他們之間的權值為0而已。這也是matlab里面表示這一項點與點權值的時候用一個n*n維矩陣的原因(n為點數),像這里,如果權值的大小如下定義所示的話,那么這個圖的Smoothcost項的權值矩陣可以表示為:[0,5,0,0,0; 5,0,4,0,0;0,4,0,3,0;0,0,3,0,2;0,0,0,2,0];

3)點與源匯點(類點)之間的權值Datacost

除了上述的Smoothcost項之外,圖割理論中還有一種項就是Datacost,表示的是各個點到源匯點(類點)之間的權值大小,為什么需要這一項呢?這一項的權值同樣對於分割至關重要。比如說我們最終知道點1與點2屬於s,其他店都屬於t的話,那么最終優化的結果就是1-s,2-s之間的權值可能很大,而3-s,4-s,5-s之間的權值都很小,這自然在對分割最后的形式很重要了。與上面類似,Datacost自然也得有一個矩陣來表示它了,用c表示類的話(這里只有s與t那么c為2),n表示點的個數的話,那么Datacost可以表示為一個c*n的矩陣了。比如這里就可以表示為:[1 2 3 4 5; 5 4 3 2 1];

三:關於最大流最小割的實現過程

這部分曾經也細研究過,關於具體怎么解最大流最小割的方法還真不是一種,那么在假設上述的Smoothcost和Datacost定死了以后,基本上怎么切割,通過解最大流最小割問題就可以得到答案,具體的算法有一下幾種,要明白算法實現過程的可以詳細研究,當然其實這個過程可以通過工具箱給予解決。

§3.1Ford-Fulkerson方法(增大路徑最大流算法)

§3.2Edmonds-Karp(EK)算法實現

§3.3Dinic算法

§3.4SAP算法(最短路徑增廣算法)

§3.5Preflow push method(預流-推進最大流方法)

詳細參考如下:

里面有詳細的c語言代碼,可供詳細研究實現這個的過程。

四:關於matlab下解決的工具箱

這里我們使用的工具箱為Bk_matlab,這個工具箱是國外研究圖割算法比較有名的機構研制的,網址為:http://vision.csd.uwo.ca/code/

在里面你可以找到關於Max-flow/min-cut這一項下的工具箱代碼。

需要說明的是這里,它里面使用的是改進過的最大流最小割算法,具體怎么改進的在相應下載代碼的下面有提示的相關文章,如下:

這篇文章應該很經典,應該說這個教授研究圖割算法的幾篇文章都是經典的。

有了前面基礎在使用這個工具箱基本上很簡單了。它的過程基本上可以簡化為:

1)創建一個割目標體h

2)設置相應的權值矩陣,包括Smoothcost和Datacost,把他們對於設置到h中。

3)最后直接使用能力最小化函數,也就是求取切割的函數,把所有需要斷裂的點與點之間邊的權值和未斷裂的點與類之間連接的邊的權值加起來認為是最后這個切割的能量,那么就是最小化這個能量了。

可以看到,這個工具箱操作還是相當簡單的。下面以實例來介紹一下:

現在假設有一個圖是這樣的,相應的權值如下所示:

那么首先創建一個目標體,這里目標體就是創建含有多少個節點的圖;

h = BK_Create(5);

從圖上我們可以看到數據項datacost矩陣:

dc = [1 2 5 10 0;

3 1 2  5 4];

平滑項smoothcost項:

sc = [0 2 0 0 0;

0 0 1 0 0;

0 0 0 5 0;

0 0 0 0 5;

0 0 0 0 0];

這里為什么只有1-2的權值,而沒有2-1的權值呢?由於這個工具箱認為的是圖的構建是無向的,也就是只要知道了1-2,那么2-1就等於1-2了,說白了就是這個矩陣sc在程序只使用了上三角的半部分,而下三角部分是沒有用的,因為他們實際上是上三角的對稱嘛,所以直接省略都為0了。

有了這兩個矩陣,直接使用相應的函數把矩陣加到h中即可。

BK_SetUnary(h,dc); %添加數據項

BK_SetNeighbors(h,sc); %添加平滑項

最后直接使用能量最小化函數即可:

e = BK_Minimize(h);

這樣就可以求取最小化的能量(斷裂的點與點之間邊的權值和未斷裂的點與類之間連接的邊的權值和),如果想了解具體是那些邊斷裂的怎么辦?它里面還有一個函數就是獲取標簽(分類)的函數:

L = BK_GetLabeling(h);

L出來的是一個n*1的矩陣,表示的是n個點各屬於那些類,比如若得到L=[1 2 2 1 1];表示什么呢?它表示的就是點1和4,5是屬於第一類s的,而2,3是屬於第二類t的,那么也就是哪些邊在斷裂呢?邊1-2和邊3-4吧。

把上述矩陣帶入matlab實驗最終得到的結果是e=15,L=[1;1;2;2;2];

也就是說斷裂的邊是2-3;結果如下:

上圖顯示的是分割結果,從結果可以看到兩個藍色的框里面就是各成一類的分割方式,而綠色的邊權值相加就是所謂的能量,可以看到e為1+2+1+2+5+4=15,和計算出來的一樣。那么這樣計算出來的斷裂方式是不是最優的呢?答案是的,不然你自己去斷裂其他的在計算下能量是不是比15大,隨便假設斷裂3-4的話,得到的能量e=1+2+5+5+5+4 = 22,大於15吧,實驗其他的也是類似的。只有15是最小的了。

至此,這個工具箱求取一個已知圖的最大流最小割問題就結束了,雖然大致講了下,似乎還沒有看到它的實際應用吧,那么這種方法是怎么應用到一個圖像分割上面的呢?等有機會再來詳談這一部分!~_~!。

圖割算法的進一步研究:

matlab求最小割,matlab實現圖割算法中的最大流最小割Max-flow/min-cut問題(一)相关推荐

  1. 最大流最小割定理(max flow/min cut theory)

    百度文库里面有个地址,讲的比较详细. http://wenku.baidu.com/link?url=gPXhYCduLNgZaOkKIltNDAgPGwuMTpRX7a0utvVFuqDAP9o1j ...

  2. matlab实现图割算法中的最大流最小割Max-flow/min-cut问题(一)

    转载自:http://blog.csdn.net/on2way/article/details/43276155 本篇主要介绍matlab实现Max-flow/min-cut的方法,介绍一种只实现了M ...

  3. 用matlab求残余误差,matlab在测量误差分析中的应用

    matlab在测量误差分析中的应用 MATLAB在测量误差分析中的应用 在技术测量中,按照误差的特点与性质,误差可分为:系统误差,粗大误差和随机误差.在假定不含有系统误差的情况下,可借助MATLAB对 ...

  4. 亮度均匀性 matlab,求:亮度保持的夜景图像直方图均衡算法 matlab程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求:亮度保持的夜景图像直方图均衡算法 matlab程序 我是大四学生,最近在做一个论文,头疼死了,不知道这个论文的程序怎么写.这里是matlab论坛 我想 ...

  5. matlab求微分方程精确解,matlab求微分方程精确解及近似解.ppt

    matlab求微分方程精确解及近似解.ppt 还剩 24页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 求微分方程的解q 自牛顿发明微积分以来,微分方 ...

  6. 运用数学软件matlab求无穷积分,matlab积分的计算及其简单应用论文.doc

    积分的计算及其简单应用 摘要:本文简要的概述了MATLAB 在高等数学中积分的计算及应用:利用MATLAB 中符号积分和数值积分的命令,计算定积分和不定积分.同时,也可以通过这些命令来解决一些实际问题 ...

  7. matlab 求曲面体积,matlab求两曲面之间的体积

    MATLAB求曲面相交所成空间曲线的图形 放在你程序后也可,单独运行也行:t=-0.1:0.1:2*pi;x=2*cos(t);%交线参数方程z=2*sin(t);y1=sqrt(5)*ones(si ...

  8. matlab 求留数,用matlab求留数

    <用matlab求留数>由会员分享,可在线阅读,更多相关<用matlab求留数(3页珍藏版)>请在金锄头文库上搜索. 1.收稿日期: 2006) 05- 29作者简介: 贾新民 ...

  9. matlab求表达式绝对值,matlab绝对值怎么表示

    Matlab 的内部常数 Matlab 的常用内部数学函数 指数函数 exp(x) log(x) 对数函数 log10(x) log2(x) 开方函数 sqrt(x) 绝对值函数 abs(x) sin ...

最新文章

  1. linux C 多线程编程
  2. 如何通过 Linq 将集合拆成多个块?
  3. DevSecOps简介(二)
  4. Python标准库:内置函数ascii(object)
  5. 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。...
  6. php弹窗拨打电话,调用系统的拨打电话,不弹框或多次出现弹框问题
  7. Ubuntu18.04安装Oracle11g
  8. 本地搭建Redis集群 windows(图文详解)
  9. Cax 渲染的精致响应式饼图
  10. java 继承extends
  11. 华为交换机RRPP的基本配置
  12. cfa英语不好的怎么学_英文不好考CFA难度大吗?
  13. html输入提示框点击确认显示内容,前端 自定义确认提示框(二)
  14. 汽车机油压力传感器在发动机中发挥着怎样的重要作用?
  15. 经典扫雷,回忆童年(扫雷c++代码)
  16. 利用牛顿迭代法 求n次方根
  17. 杰理-AC69-按键-iO按键-AD按键-触摸按键
  18. 五子棋AI算法-Alpha Beta剪枝
  19. java音频解析_wav音频文件头动态解析--java语言
  20. 区块链之加解密算法数字证书

热门文章

  1. 无失真传输matlab原理,信号与系统实验(MATLAB版)实验23综合实验4——无失真传输系统.ppt...
  2. em算法直观_直观地解释了10种图形算法
  3. 做影视后期特效最好用什么软件?_百度知道
  4. VMware Esxi补丁包手工执行升级
  5. 与大漠飞狐,轻舞的雨丝交流
  6. 【Pyecharts50例】图表背景颜色设置
  7. 通过Python的pytesseract库识别图片中的文字
  8. jQ模拟逐帧动画动画
  9. scratch3的作品打包成exe(自带chrome浏览器方案)
  10. 万字长文带你了解推荐系统全貌