参考:
参考项目一:https://github.com/NathanZabriskie/GraphCut
参考项目二:https://github.com/cm-jsw/GraphCut
运行环境:
1.python3.x
2.所需库函数:numpy,opencv-python
3.操作步骤:
1) 长按鼠标右键在分割目标周围标定矩形框,矩形框外的区域被自动认为是背景;
2) 按字母'n'得到初步分割结果;
3) 按数字'0',在input图上通过长按鼠标左键进行背景标注,按字母'n'得到初步分割结果。(标注处为背景区域去掉);
4) 按数字'1',在input图上通过长按鼠标左键进行前景标注,按字母'n'得到初步分割结果。(标注处为前景区域增加保留)
5) 按数字'2',在input图上通过长按鼠标左键进行背景标注,按字母'n'得到初步分割结果。(标注处为可能为背景区域);
6) 按数字'3',在input图上通过长按鼠标左键进行前景标注,按字母'n'得到初步分割结果。(标注处为可能为前景区域);
7) 按字母'r',重置;
8) 按字母's',将分割后的图片保存到输出文件;
9) 按键盘'esc',退出;
在input图片中标定含有物体的矩形,矩形外的区域被自动认为是背景,对于用户标定的矩形区域,可用背景中的数据来区别它里面的前景和背景区域。用高斯混合模型(GMM)来对背景和前景建模,并将末定义的像素标记为可能的前景或背景。图像中的每一个像素都被看作通过虚拟边与周围像素相连接,而每一条边都有一个属于前景或背景的概率,这基于它与周围像素颜色上的相似性。每一个像素会与一个前景或背景节点连接。若节点之间不属于同一个终端(就是两个相邻的节点,一个节点属于前景,一个节点属于背景),则会切断它们之间的边,这就将图像各个部分分割出来了。
# -*- coding:utf-8 -*-
# Python 2/3 compatibility
from __future__ import print_function