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

【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://www.mzph.cn/news/565509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VScode 透明背景设置

我们通常使用VScode开发项目,时间长了不免有些疲惫,在此教给大家一个设置VScode 透明背景的方法,给大家的代码之旅带来一点乐趣。 1.首先在vscode扩展中,找到并下载background这个插件,快捷键Ctrlshiftx 2.完成第一步…

【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…

IDEA设置主题和背景图片

我们使用IDEA开发的时候长期使用一种主题会感到沉重,那麽我们如何为IDEA设置我们自己想要的背景图片呢??? 一 . 设置主题 Idea主题自带的有三种:1、黑色模式 2、Intellij模式 3、高对比度模式; 具体修改步…

【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…

java concurrent int_java.util.concurrent.AtomicInteger

AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,i和i操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。来看AtomicInteger提供的接口。//…

IDEA创建SpringBoot

对于SpringBoot的开发我们使用IDEA工具是非常方便的,不仅开发效率高,而且代码能自动添加补全,那麽我们如何使用IDEA创建SpringBoot项目呢??? 1.使用IntelliJ IDEA 内置的Spring Initializr来创建SpringBoo…

【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…

procyon java8_java jdk 8反编译工具JD-GUI、procyon-decompiler、luyten、crf下载使用简介

本文对常用的反编译工具进行简单介绍JD-GUI、procyon-decompiler、luyten、crf反编译工具分类JD-GUIJDK7以及之前可以使用 JD-GUI,如果版本>1.8 各种问题http://java-decompiler.github.ioprocyon-decompiler如果版本>1.8 ,可以使用 procyon-dec…

SpringBoot页面出现 Whitelabel Error Page

我们运行SpringBoot项目之后需要通过Tomcat进行访问,但是我们访问的时候出现了Whitelabel Error Page的错误,我们该如何解决呢??? 错误页面 究其原因是我们的主程序缺少一个RestController的注解。 没有使用RestCon…

SpringBoot入门小案例

使用SpringBoot项目输出一个hello SpringBoot的入门小项目。 1.再IDEA中创建SpringBoot项目,创建完成如下所示。 2.项目创建完后打开包结构,WebApplication是项目的入口,是启动类,SpringBootApplication,这个注解非常…

【youcans 的 OpenCV 例程200篇】183.基于轮廓标记的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…

【youcans 的 OpenCV 例程200篇】184.鼠标交互标记的分水岭算法

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法 【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法 【youcans 的 OpenCV 例程200篇】183.基…

【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔 6. 图像金字塔 图像金字塔是一种以多分辨率来解释图像的结构,常用于图像分割、图像压缩和机器视觉。 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列…

【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔 图像金字塔是一种以多分辨率来解释图像的结构,常用于图像分割、图像压缩和机器视觉。 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步…

【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征。通常&…

整型和浮点型之间的转化

在Java中,我们如何将整型转化为浮点型,或者我们如何将浮点型转化成整型的呢? 结果演示 代码演示 package com.ten;public class Zidongzh {public static void main(String[] args) {double a 127.0;float b(float)a;float c(float)b;int…

【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征。通…

【youcans 的 OpenCV 例程200篇】189.基于掩模的拉普拉斯金字塔图像融合

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】189.基于掩模的拉普拉斯金字塔图像融合 图像金字塔是一系列来源于同一张原始图像、以金字塔形状排列的分辨率逐步降低的图像集合。从底层图像可以看清更多细节,从顶层图像可以看到更多的轮廓特征…

中奖程序

使用Java做了一个中奖程序,程序中已经设置中奖的号码,根据文本提示会让你输入四个数字,当你输入你的四个数字之后程序会给出你是否中奖的结果显示。 结果演示 代码演示 package com.ten; import java.util.Scanner; public class ZhongJi…

【youcans 的 OpenCV 例程200篇】190.基于图像分割的图像融合

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】190.基于图像分割的图像融合 两张图像直接进行加法运算后图像的颜色会改变,通过加权加法实现图像混合后图像的透明度会改变,都不能实现图像的叠加。 实现图像的叠加,需要…