文章目录
- 一、图割
- 二、运行
- 结果
- 三、主要代码
- 四、总结
使用最大流最小流算法实现图割,基于Python的程序。
话不多说,下面就是介绍.
一、图割
废话还是要说点的,显得大气些。
图像分割作为计算机视觉领域的基础研究方向,多年来一直受到众多研究人员的密切关注,经过多年发展,广大学者提出了许多有效的图像分割算法,本文将图像分割问题与图论中的Ford-Fulkerson标号算法相关联。Ford-Fulkerson标号算法总的来说就是不断地在图中找增广路径(一条从源点到汇点的路径,所有前向边都是非饱和边,反向边都是非零边)。图像分割方法的原理是将图像映射为加权无向图,并通过最大流最小截定理求得其最小截,从而分割出图像中的目标。
二、运行
程序实现添加待操作的图像,用户进行画笔标记需要切分的两块区域,点击运行。首先会展示将要切割输出的图像,以红色背景为标记。之后用户可选择是否保存切割输出。
结果
原图(示例):
操作图(标记出切割区域):
初切割展示:
切割后的保存输出图片:
三、主要代码
主文件GraphCut.py :
# coding=utf-8
import CutUI
if __name__ == '__main__':
# 参数1:输入文件,参数2:输出文件。
ui = CutUI.CutUI('resource/1.jpg', 'resource/new.jpg')
ui.run()
图片操作GraphMaker.py主要方法 :
def cut_graph(self):
self.segment_overlay = np.zeros_like(self.segment_overlay)
self.mask = np.zeros_like(self.image, dtype=bool)
g = maxflow.Graph[float](len(self.nodes), len(self.edges))
nodelist = g.add_nodes(len(self.nodes))
for node in self.nodes:
g.add_tedge(nodelist[node[0]], node[1], node[2])
for edge in self.edges:
g.add_edge(edge[0], edge[1], edge[2], edge[2])
# 对图片开始执行切割
g.maxflow()
for index in range(len(self.nodes)):
if g.get_segment(index) == 1:
xy = self.get_xy(index, self.image.shape)
self.segment_overlay[xy[1], xy[0]] = (255, 0, 255)
self.mask[xy[1], xy[0]] = (True, True, True)
上面的这段代码只是GraphMaker.py中的方法之一。
运行时,控制台输出:
正在切割图片:
保存输出图片完成:
四、总结