文章目录

  • 一、图割
  • 二、运行
  • 结果
  • 三、主要代码
  • 四、总结


使用最大流最小流算法实现图割,基于Python的程序。


话不多说,下面就是介绍.

一、图割

废话还是要说点的,显得大气些。

图像分割作为计算机视觉领域的基础研究方向,多年来一直受到众多研究人员的密切关注,经过多年发展,广大学者提出了许多有效的图像分割算法,本文将图像分割问题与图论中的Ford-Fulkerson标号算法相关联。Ford-Fulkerson标号算法总的来说就是不断地在图中找增广路径(一条从源点到汇点的路径,所有前向边都是非饱和边,反向边都是非零边)。图像分割方法的原理是将图像映射为加权无向图,并通过最大流最小截定理求得其最小截,从而分割出图像中的目标。

二、运行

程序实现添加待操作的图像,用户进行画笔标记需要切分的两块区域,点击运行。首先会展示将要切割输出的图像,以红色背景为标记。之后用户可选择是否保存切割输出。

结果

原图(示例):

python做图像分割 图像分割python代码_最大流

操作图(标记出切割区域):

python做图像分割 图像分割python代码_最大流_02

初切割展示:

python做图像分割 图像分割python代码_最大流_03

切割后的保存输出图片:

python做图像分割 图像分割python代码_python做图像分割_04

三、主要代码

主文件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中的方法之一。

运行时,控制台输出:
正在切割图片:

python做图像分割 图像分割python代码_python做图像分割_05


保存输出图片完成:

python做图像分割 图像分割python代码_图像处理_06


四、总结