一、原理
GrabCut是graph cut的改进版,是迭代的graph cut。该算法利用了图像中的纹理(颜色)信息和边界(反差)信息,只要小量的用户交互操作即可得到比较好的分割效果。
计算原理参考:点击打开链接,点击打开链接
在整个过程发什么了什么呢?
1、用户输入一个矩形。矩形外的所有区域肯定是背景。矩形框内的东西是未知的。同样用户确定前景和背景的任何操作都不会被程序改变。
2、计算机会对我们的输入图像做一个初始化标记。它会标记前景和背景像素。
3、使用一个高斯混合模型(GMM)对前景和背景建模
4、根据我们的输入,GMM会学习并创建新的像素分布。对那些分类未知的像素(可能是前景也可能是背景),可以根据他们与已知分类(如背景)的像素关系来进行分类(就想在做聚类操作)。
5、这样就会根据像素的分布创建一幅图。图中的节点就是像素点。除了像素点做节点之外还有两个节点:Source_node和Sink_node。所有的前景像素都和Source_node相连。所有的背景像素都和sink_node相连。
6、将像素连接到Source_node/end_node的边的权重由他们属于同一类的概率决定。两个像素之间的权重由边的信息或者两个像素的相似性来决定。如果两个像素的颜色有很大的不同,那么它们之间的边的权重就会很小。
7、使用mincut算法对上面的图进行分割。它会根据最低成本方程将图像分为Source_node和Sink_node。成本方程就是被剪掉的所有边的权重之和。在裁剪之后,所有连接到Source_node的像素被认为是前景,所有连接到Sink_node的像素被认为是背景。
8、继续这个过程知道分类收敛。
演示
OpenCV提供了函数cv.grabCut()。
grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, mode=None)
img: 输入图像,必须是8位3通道图像,在处理过程中不会被修改
mask: 掩码图像,用来确定哪些区域是背景,前景,可能是背景,可能是前景等。
GCD_BGD (=0), 背景; GCD_FGD (=1),前景;GCD_PR_BGD (=2),可能是背景;GCD_PR_FGD(=3),可能是前景。
如果没有手工标记GCD_BGD 或者GCD_FGD,那么结果只会有GCD_PR_BGD和GCD_PR_FGD
rect: 包含前景的矩形,格式为(x, y, w, h)

bdgModel,fgdModel: 算法内部使用的数组,只需要创建两个大小为(1,65),数据类型为np.float64的数组

iterCount: 算法迭代的次数
mode: 用来指示grabCut函数进行什么操作:
cv.GC_INIT_WITH_RECT (=0),用矩形窗初始化GrabCut;
cv.GC_INIT_WITH_MASK (=1),用掩码图像初始化GrabCut。
具体代码:
img = cv.imread('img/meixi.jpg')
newmask = cv.imread('img/meixi_2.png', 0)cv.imshow('meixi_1', newmask)
cv.imshow('image', img)
#转成rgb格式
b,g,r=cv.split(img)
img[:,:,0]=r
img[:,:,2]=bmask = np.zeros(img.shape[:2], np.uint8)bgdModel = np.zeros((1, 65), np.float64)
fgbModel = np.zeros((1, 65), np.float64)rect = (80, 20, 230, 270)
cv.grabCut(img, mask, rect, bgdModel, fgbModel, 5, cv.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0), 0, 1).astype('uint8')
img = img * mask2[:,:,np.newaxis]
plt.imshow(img)
plt.show()
值得提一下,OpenCV读取的图像是BGR格式 ,而matplatlab支持的是RGB格式的图像,所以为了正常显示,必须转换一下。

手臂内的背景还没有消除,所以我们来修改一下掩模图像。打开PS,添加一个图层,用笔刷在需要的地方用白色绘制(如头发,鞋子,球);使用黑色笔刷在不需要的地方绘制。然后将其他地方用灰色填充,保存成新的掩码图像。在OpenCV中导入这个掩码图像,根据新的掩码图像对原来的掩码图像进行编辑。
newmask = cv.imread('img/meixi_2.png', 0)
cv.imshow('meixi_1', newmask)
mask[newmask == 0] = 0
mask[newmask == 255] = 1
mask, bgdModel, fgbModel = cv.grabCut(img, mask, None, bgdModel, fgbModel, 5, cv.GC_INIT_WITH_MASK)
mask2 = np.where((mask==2)|(mask==0), 0, 1).astype('uint8')
img = img * mask2[:,:,np.newaxis]
plt.imshow(img)
plt.show()
效果:

手臂内的背景没有了,不过头发和足球还是没显示出来,我也找不到原因,如果有人实现了,请帮忙告诉我怎么做。
这个是新增的掩码图像

打开

OpenCV学习笔记-图像分割之GrabCut相关推荐

  1. Opencv学习笔记 图像分割三(ImageJ 分水岭)

    ImageJ是一款基于 java的,由 National Institutes of Health(NIH)开发的一款功能强大的图像处理软件,在科研中应用极为广泛.其中也是包含有java实现的分水岭算 ...

  2. 分水岭算法java,OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法...

    1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...

  3. OpenCv学习笔记4--图像分割之GrabCut算法

    说明: 本文章是opencv学习笔记系列的第四篇小结,可能前几篇内容太多,排版也不甚合理,所以为了更好的观看体验,这次的内容会稍微少那么一点点,再次重申 所有代码在我的github主页https:// ...

  4. OpenCV学习笔记(十二)——图像分割与提取

    在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...

  5. OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc

    OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...

  6. opencv python 直方图反向投影_python OpenCV学习笔记直方图反向投影的实现

    本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下: 它用于图像分割或寻找图像中感兴趣的对象.简单地说,它创建一个与我们的输入图像相同大小(但单通道)的图像,其中每 ...

  7. OpenCV 学习笔记(Watershed)

    OpenCV 学习笔记(Watershed) Watershed,中文一般翻译为分水岭算法.分水岭算法是一种图像区域分割算法,它把位置接近,灰度值也接近的像素点连接起来形成一个封闭的区域.关于分水岭算 ...

  8. OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法...

    函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...

  9. opencv学习笔记(二):基于肤色的人手检测

    opencv学习笔记(二):基于肤色的人手检测 原文:http://blog.csdn.net/wzmsltw/article/details/50849810 先写了人手的检测程序,下一步基于检测程 ...

最新文章

  1. 方阵旋转180度JAVA代码_方阵顺时针旋转的实现代码
  2. String为什么是不可变类型?
  3. python numpy sum函数,numpy.sum()的使用详解
  4. setseed_Java Random setSeed()方法与示例
  5. 提升R代码运算效率的11个实用方法——并行、效率
  6. 26. Magento 常用(1)
  7. AI - 机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总
  8. java 代码走查_Java代码走查具体考察点
  9. BAT4行代码让电脑蓝屏(无伤害)
  10. 使用阿里云服务来部署云桌面
  11. 互联网思维之迭代思维
  12. 2023-2029年中国博物馆旅游行业市场经营管理及发展前景规划报告
  13. poj 2586 Y2K Accounting Bug
  14. 简述固定资产的全生命周期管理流程
  15. 关于编码问题的复制黏贴
  16. 学画画要花多少钱_孩子学画画大约需要多少钱呢?
  17. 03 循环、字符串、列表、元祖、字典
  18. 深度学习常见数据集汇总
  19. 不干正事儿系列文章1:Sonic Pi简单应用
  20. 优麒麟 2204 与 win10 双系统安装笔记

热门文章

  1. 服务器无法重命名 请确定磁盘未满或未被写保护而且文件夹未被使,请确定磁盘未满或未被写保护而且文件未被使用 解决办法...
  2. 5SHX0660F0001 IGCT ABB 5SHX0660F0001 3BHL00386P0101
  3. Oracle营销云与微信集成,打造个性化体验
  4. 计算机系统的有哪些功能是什么意思,olt是什么意思(olt有什么功能和用途)
  5. WTF Solidity极简入门: 39链上随机数
  6. ccna出来能做什么_CCNA的完整形式是什么?
  7. 滴滴大数据安全权限实践
  8. 产品数据管理(PDM)技术与应用
  9. 刚看到的《当幸福来敲门》体会浓缩版
  10. c小项目,小码资金管理工具