【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)

article/2025/10/1 2:46:10

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法
【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法
【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法(框选前景)
【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】


【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)


6. 图像分割之图割法

基于图论的图像分割技术的基本思想是:将图像映射为带权的无向图,把像素视为节点,两个节点之间的边的权重对应于两个像素之间相似性的度量,割的容量就对应于能量函数;使用最大流最小割算法对图进行切割,得到的最小割就对应于最优图像分割。

6.3 图割分割算法 GrabCut

GrabCut 算法是对 GraphCut 的改进,使用高斯混合模型(GMM)对背景和目标建立模型,采用迭代方法实现分割能量的最小化,同时支持不完整的标记。

GrabCut 算法有效利用了图像中的纹理(颜色)信息和边界(反差)信息,只需要要少量的人工交互操作就可以对目标实现较好的分割效果。

OpenCV 也提供了函数 cv.grabCut 实现 GrabCut 图割算法。

函数说明:

cv.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount[, mode=GC_EVAL]) → mask, bgdModel, fgdModel 

参数说明:

  • image:输入图像,8-bit/3-channel 彩色图像
  • mask:输入/输出掩模,8-bit 单通道图像,如边界框选则自动产生掩模图像
  • rect:包含分割对象的边框矩形,格式为 (x,y,w,h),仅在 mode 为 cv2.GC_INIT_WITH_MASK 时适用
  • bgdModel:建模背景使用的临时数组,形状为 (1,65) 的 np.float 数组
  • fgdModel:建模前景时使用的临时数组,形状为 (1,65) 的 np.float 数组
  • iterCount:迭代次数
  • mode:操作模式
    • cv.GC_INIT_WITH_RECT:使用边界矩形初始化状态和掩模图像,运行迭代算法
    • cv.GC_INIT_WITH_MASK:使用提供的掩模图像进行状态初始化
    • cv.GC_EVAL:表示算法应该恢复
    • cv.GC_EVAL_FREEZE_MODEL:用固定模型执行一次迭代算法

OpenCV 的 GrabCut 返回一个3元组 (mask, bgdModel, fgdModel)

  • mask: 应用GrabCut后的输出掩模
  • bgModel: 用于建模背景的临时数组(可以忽略此值)
  • fgModel: 用于建模前景的临时数组(同样,你可以忽略此值)

注意事项:

  • OpenCV 的 GrabCut 返回元组 (mask, bgdModel, fgdModel),mask 是应用 GrabCut 算法后的输出掩模。
  • 迭代次数越多,GrabCut 运行的时间越长,理想情况下的性能会更好。
  • cv.GC_INIT_WITH_RECT 和 cv.GC_INIT_WITH_MASK 可以组合使用。

例程 11.36: GrabCut 图割分割算法(掩模图像)

例程11.34 通过手动设置边界框对 GrabCut 算法进行初始化,我们也可以使用掩模图像进行初始化。掩模图像提供了图像中物体的近似分割,GrabCut 算法可以迭代地应用图割对分割结果进行改进,从图像中提取前景。

如何生成掩模图像与 GrabCut 算法无关,掩模图像也并不需要很精确。掩模图像可以通过 Photoshop 等编辑软件手动创建,也可以应用阈值分割、边缘检测、轮廓滤波等方法获取,还可以利用深度学习方法获得。

# Copyright 2022 Youcans, XUPT
# Crated:2021-12-27# 11.36 GrabCut 图割分割算法(掩模图像)image = cv2.imread("../images/imgDeer.png", flags=1)  # 读取彩色图像(BGR)maskImg = cv2.imread("../images/imgDeerMask.png", flags=0)  # 读取掩模图像(xupt)# 生成掩模图像 mask,大于 0 的像素设为可能前景mask = np.zeros(image.shape[:2], dtype="uint8")mask[maskImg > 0] = cv2.GC_PR_FGDmask[maskImg == 0] = cv2.GC_BGD# print(mask.shape, maskInv.shape)# apply GrabCut using the the mask segmentation methodfgModel = np.zeros((1, 65), dtype="float")  # 前景模型, 13*5bgModel = np.zeros((1, 65), dtype="float")  # 背景模型, 13*5iter = 5(mask, bgModel, fgModel) = cv2.grabCut(image, mask, None, bgModel, fgModel, iter,mode=cv2.GC_INIT_WITH_MASK)  # 基于掩模图像初始化# 将所有确定背景和可能背景像素设置为 0,而确定前景和可能前景像素设置为 1maskOutput = np.where((mask == cv2.GC_BGD) | (mask == cv2.GC_PR_BGD), 0, 1)maskGrabCut = 255 - (maskOutput * 255).astype("uint8")imgGrabCut = cv2.bitwise_and(image, image, mask=maskGrabCut)plt.figure(figsize=(10, 6))plt.subplot(231), plt.axis('off'), plt.title("Origin image")plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))  # 显示 img(RGB)plt.subplot(232), plt.axis('off'), plt.title("Mask image")plt.imshow(maskImg, 'gray')  # definite backgroundplt.subplot(233), plt.axis('off'), plt.title("GrabCut mask")plt.imshow(mask, 'gray')plt.subplot(234), plt.axis('off'), plt.title("Mask for definite background")maskBGD = (mask == cv2.GC_BGD).astype("uint8") * 255plt.imshow(maskBGD, 'gray')  # definite backgroundplt.subplot(235), plt.axis('off'), plt.title("Mask for probable background")maskPBGD = (mask == cv2.GC_PR_BGD).astype("uint8") * 255plt.imshow(maskPBGD, 'gray')  # probable background# plt.subplot(235), plt.axis('off'), plt.title("GrabCut Mask")# plt.imshow(maskGrabCut, 'gray')  # mask generated by GrabCutplt.subplot(236), plt.axis('off'), plt.title("Youcans Output")plt.imshow(cv2.cvtColor(imgGrabCut, cv2.COLOR_BGR2RGB))  # GrabCut Outputplt.tight_layout()plt.show()

在这里插入图片描述



(本节完)


版权声明:

OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124744517)

Copyright 2022 youcans, XUPT
Crated:2022-5-12


欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法
【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法
【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法(框选前景)
【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】


http://chatgpt.dhexx.cn/article/NYUWdfKW.shtml

相关文章

OpenCV python 掩模处理学习笔记

OpenCV python 掩模处理 前言1.1 掩模是什么1.2 掩模的原理1.3 构造掩模图像总结 前言 接上篇OpenCV Python 直方图的使用。在opencv中使用掩模对图像进行处理是一个十分常用的方法。本篇是记录掩模操作的原理及使用。小白入门,如有不正确的地方希望大佬指正。 提示…

OpenCV基于Python图像掩模处理

图像掩模 目标1. 图像掩模的概念2. 图像掩模的作用3. 示例演示 目标 本篇文章主要介绍图像掩模的概念、作用、及其简单实现。 1. 图像掩模的概念 图像掩模(image mask)是用选定的图像、图形或物体,对待处理的图像(局部或全部&a…

CodedStereo:大尺度景深双目视觉的相位掩模学习(CVPR2021)

点击上方“3D视觉工坊”,选择“星标” 干货第一时间送达 来源丨泡泡机器人SLAM 作者丨泡泡机器人 标题:CodedStereo: Learned Phase Masks for LargeDepth-of-Field Stereo 作者:Shiyu Tan, Yicheng Wu, Shoou-I Yu, Ashok Veeraraghavan 机构…

OpenCV笔记整理【直方图和掩模】

1. 直方图: 直方图统计图像中各个灰度级出现的次数,横坐标为各个像素点的灰度级,纵坐标是具有该灰度级的像素个数。 上面这个九宫格我们可以想象成一张图像,里面的数字代表当前像素的灰度等级。 用图表显示:X轴代表…

数字图像处理 掩模

将logo叠加在图片上 将logo图片进行灰度化阈值处理得到掩模 (需要的部分是置非0 不需要的黑色的部分置0) 然后需要利用掩模对logo图像和人物图像分别进行处理 对logo图: 需要把黑色部分去掉-----与掩模进行与操作把黑色部分置0 Ps:黑色部分用add叠加时相当于没有…

OpenCV基本功 之 图像的掩模、运算 合并专题 -小啾带学【Python-Open_CV系列(七)】

OpenCV图像的掩模、运算 与 合并专题 【Python-Open_CV系列(七)】 文章目录 1.图像的掩模2.图像的运算2.1 图像的加法运算2.1.1 “”方法2.1.2 cv2.add()方法2.1.3 使用掩模遮盖相加结果 2.2 图像的位运算2.2.1 按位与 cv2.bitwise_and()2.2.2 按位或 c…

空间掩模matlab,浅谈基于SLM的非相干全息系统掩模设计及成像处理

宋冲 摘要:基于空间光调制器(Spatial Light Modulator,SLM)的菲涅尔非相干相关数字全息系统,无需对物体在空间或时间上进行扫描,可以快速获取真实三维物体的全息图,在荧光生物样品显微成像、彩色全息显示、以及自适应光学等领域展示了极大应用潜力。通过本项目的研究,为S…

matlab 掩模,用于图像中的与脸部有关的选择和处理的图像掩模制造技术

【技术实现步骤摘要】 【国外来华专利技术】【专利说明】用于图像中的与脸部有关的选择和处理的图像掩模相关串请的交叉引用本申请要求对通过完全引用而结合于此、提交于2013年5月14日的第13/894,384号美国专利申请的优先权。 技术介绍 数字相机的流行和便利以及因特…

图像掩模matlab,图像掩模_matlab_图像掩模

光学图像处理中,掩模可以足胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。数字图像处理中,图像掩模主要用于:①提取感兴趣区,用预先制作的感兴 未来手机触摸屏要靠无掩模光刻技术_多点触摸 337x396 - 29KB - JPEG 5.4.3 选择式掩模平滑 - 51CTO.COM 53…

图像中的掩膜(Mask)是什么

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步 在图像处理中,经常会碰到掩膜(Mask)这个词。那么这个词到底是什么意思呢?下面来简单解释一下。 1.什么是掩膜 …

第三章-OpenCV基础-4-掩模

基本概念 掩模,又称为掩膜,掩码,模板。图像掩模是指,用特定的图像/图形/物体遮挡代处理的图像(全部或局部),从而控制图像处理的区域,在数字图像处理中,掩模就是一个指定的数组,毕竟,图像也是数组。 左边图为原图,中间图为掩模(白色区域为透明区域,黑色区域为黑色遮挡区域),经过…

在微信小程序中如何引入iconfont

在微信小程序如何引用iconfont? 1.首先进入iconfont 选择自己喜欢的图标 iconfont-阿里巴巴矢量图标库 2.选择自己喜欢的图标加入购物车 3.将图标添加至项目(如果没有项目就随便新建一个项目) 4.打开个人主页 找到自己的项目,点…

微信小程序引入iconfont

第一种 在tabBar中使用 只能下载到本地,放在文件夹中使用 如下图: 第二种 在页面内使用iconfont图标 1:复制代码 2:粘贴到wxss文件里 3:在app.wxss中引入该文件 4:就可以在文件里面使用iconfont图…

微信小程序中使用tabBar

文章目录 前景知识小程序项目app.jsonpages/home/home.wxmlpages/camera/camera.wxmlpages/user/user.wxml 相关链接 前景知识 前面我们学习过:在app.json里对小程序进行全局配置,app.json的文件内容是一个JSON对象,包含很多属性&#xff0c…

微信小程序|icon列表跳转不同界面

效果&#xff1a; 包含图片、文字&#xff0c;分列布局&#xff0c;点击对应图标跳转到相应界面 WXML&#xff1a; <!-- 三个主要功能:文书服务&#xff0c;在线咨询&#xff0c;律师匹配跳转到对应页面&#xff0c;可以返回注意php后台和数据库搭建--><view class&…

微信小程序引入阿里巴巴icon步骤及报错解决

首先将选择好的图标加入购物车,点击右上角购物车图标&#xff0c;将其添加进项目中。(Add To Project) 添加进入项目后&#xff0c;会自动跳转到该项目&#xff0c;选择Download Code&#xff0c; 解压缩包&#xff0c;只会用到文件夹中的4个文件&#xff0c;将解压后的下面4个…

微信小程序引入iconfont图标

一、查看iconfont项目设置 二、生成在线链接 为什么要生成在线链接&#xff0c;因为微信小程序不能用静态文件 三、根据下载的iconfont.css配置app.wxss 下载的iconfont.css配置 自定义app.wxss配置 为什么不直接用iconfont.css&#xff0c;因为微信小程序不支持css只支持wxss…

《微信小程序-进阶篇》组件封装-Icon组件的实现(一)

大家好&#xff0c;这是小程序系列的第九篇文章&#xff0c;从这篇开始我们将进入提高篇&#xff0c;在这一个阶段&#xff0c;我们的目标是可以较为深入的了解组件化开发&#xff0c;并且实践积累一些后续项目也就是原神资料站中用得着的组件&#xff1a; 1.《微信小程序-基础…

uniapp与微信小程序引入iconfont

加入购物车&#xff0c;下载解压 引入 uniapp 微信小程序 使用 icon更新后更换线上url&#xff0c;就不用每次下载解压

微信小程序引入下载至本地的iconfont图标

在写小程序项目中遇到icon图标引入不起作用&#xff0c;原因是因为小程序必须先转为base64引入&#xff01; 第一步 选好自己要用的icon图标并下载至本地 下载后得到这样目录的文件 第二步 转换成base64 网址&#xff1a;https://transfonter.org/ 选择后缀为.ttf的文件 第…