图割的基本思想是利用最大流算法求最小割,将元素划分为两个不相交的子集。现有的图切割方法可分为两类:一类是基于增广路径(augmented path)的方法,另一类是基于push-relabel的方法。
增广路径(augmented path)派
基于增广路径的图割算法难以并行化。
最早的基于增广路径的算法应该是1962年提出的Ford-Fulkerson算法:
令网络中的初始流量为零,沿着任意从起点到终点(且不含有饱和的正向边或是空逆向边)的增广路径增大流量,直到网络中不存在这样的路径为止。此时,网络中存在最大流和最小割。
其中,增广路径简单来说就是这么一条路径:
- 该路径是从节点S到节点T的一条路径;
- 该路径上所有边目前剩下的容量都大于0。
Ford-Fulkerson算法伪代码:
while(true){
找一条增广路径;
if(找不到) break;
找增广路径中未使用容量最小值,路径各个边减去这个值;
}
后续很多增广路径的方法都是基于这个框架的改进,比如研究如何更快地找到一条增广路径。比较经典的是2004年,Boykov and Kolmogorov提出的算法(简称BK算法)。
push-relabel派
基于push-relabel的图割算法容易并行化,但是并行化的算法可能收敛缓慢,或者得不到全局最优解,换句话说就是结果可能出错。
详情见WIKI。
如何得到最小割
最小割和最大流经常被放到一起讨论,因为这二者是一个等价问题,当求出最大流的值时,最小割的值等于最大流的值。然而许多文章详细说明了如何求最大流(的值),却没有说明另一个问题:
得到最大流(或最小割)的值后,我怎么进一步确定割边集?
换句话说就是,我应该割掉哪些边,以得到两个不同的集合S和T?很多时候我们更关心应该割哪些边,而不关心最大流(最小割)的值是多少。例如当我需要拿图割这个工具进行图像抠图(图像分割)和三维点云表面(mesh)重建时。
其实确定割边集很简单,无论是增广路径(augmented path)的方法还是push-relabel的方法,得到最大流后,都会同时得到一个剩余网络(residual network),在残余网络中从顶点S出发遍历,能遍历到的顶点都属于集合S,其他的点则属于集合T,集合S指向集合T的那些饱和边就是最小割的割边。
参考文献
- Peng, Yi, et al. “JF-Cut: A parallel graph cut approach for large-scale image and video.” IEEE Transactions on Image Processing 24.2 (2014): 655-666.
- 《算法》第四版
- WIKI: Push–relabel maximum flow algorithm