opencv实战项目二十九:GrabCut分割人像

embedded/2024/10/11 1:16:08/

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、GrabCut介绍:
  • 二、opencv实现:
  • 三、效果:


前言

在数字图像处理领域,人像分割是一项极具挑战性的任务,它旨在从复杂背景中准确提取出人物图像。随着技术的不断发展,人像分割技术在许多领域都展现出了广泛的应用前景,如摄影后期处理、视频监控、虚拟现实等。在这其中,GrabCut 算法作为一种高效、精确的图像分割方法,备受关注。本文将带你深入了解 GrabCut 算法,探讨如何利用它来实现人像的精确分割,让你在处理图像时能够轻松应对复杂背景,为创作和科研带来更多可能性。

一、GrabCut介绍:

GrabCut 是一种迭代的图割(Graph Cut)算法,由微软研究院的 Carsten Rother、Vladimir Kolmogorov 和 Andrew Blake 在2004年提出。它用于从静态图像中分离出前景对象和背景,通常只需要用户提供一个矩形框来大致标记前景对象,就能自动完成精确的分割。

以下是 GrabCut 算法的基本步骤和原理:

  1. 初始化
    用户输入:用户在图像中绘制一个矩形框,框内大致包含前景对象。
    背景/前景标记:矩形框内的像素被标记为可能的前景(T),矩形框外的像素被标记为可能的背景(B)。
  2. 高斯混合模型(GMM)
    模型训练:算法使用高斯混合模型来建模前景和背景的颜色分布。每个组件(前景或背景)都由一个高斯分布表示,这些分布的参数通过迭代优化来估计。
    像素分配:每个像素根据其颜色被分配给前景或背景的高斯分布之一,分配的过程会影响分布参数的更新。
  3. 图构建
    节点:图像中的每个像素对应图中的一个节点。
    边:节点之间通过边连接,边的权重表示像素之间的相似度。通常,像素之间的相似度是基于颜色差异来计算的。
    源点和汇点:图中有两个特殊的节点,源点(source)和汇点(sink)。源点连接所有标记为前景的像素,汇点连接所有标记为背景的像素。
  4. 能量最小化
    能量函数:算法定义了一个能量函数,它由数据项和光滑项组成。数据项表示像素属于前景或背景的概率,光滑项则惩罚相邻像素属于不同区域的决策。
    图割:通过最小化能量函数,GrabCut 算法在图中进行切割,将节点分为两部分,一部分连接到源点(前景),另一部分连接到汇点(背景)。
  5. 迭代优化
    迭代更新:在初次图割之后,算法可能会根据切割结果更新GMM模型中的参数,然后重新进行图割。
    用户反馈:用户可以提供额外的反馈,如标记某些像素为前景或背景,以改进分割结果。
  6. 输出结果
    前景提取:最终,GrabCut 算法输出一个前景掩码(mask),其中包含被分割出来的前景对象。

GrabCut 算法的优势在于它能够处理较为复杂的背景,并且用户交互简单,通常只需要提供一个矩形框即可。然而,它也有局限性,比如对于透明物体或颜色与背景相似的前景对象,GrabCut 可能无法达到理想的分割效果。此外,GrabCut 算法假设图像中的前景对象颜色分布是连贯的,这在某些情况下可能不成立。尽管如此,GrabCut 仍然是一个非常实用的图像分割工具,广泛应用于各种图像处理任务中。

opencv_38">二、opencv实现:

在opecv中有grabcut算法的api:retval, mask = cv2.grabCut(img, mask, rect, bgd_model, fgd_model, iter_count, mode),下面是 cv2.grabCut 函数的参数介绍:
输入:

img: 待分割的输入图像,通常是 8 位 3 通道(RGB)图像。
mask: 与输入图像大小相同的掩码图像,用于标记每个像素的状态。掩码图像可以是以下几种值之一:
cv2.GC_BGD: 背景像素(可能背景)
cv2.GC_FGD: 前景像素(可能前景)
cv2.GC_PR_BGD: 可能背景像素
cv2.GC_PR_FGD: 可能前景像素
cv2.GC_INIT_WITH_RECT: 初始化模式,使用矩形框
rect: 一个矩形元组 (x, y, w, h),其中 (x, y) 是矩形的左上角坐标,(w, h) 是矩形的宽度和高度。这个矩形框用于初始化前景对象的大致位置。
bgd_model: 用于背景模型的高斯混合模型(GMM)的数组,通常初始化为 np.zeros((1, 65), np.float64)。
fgd_model: 用于前景模型的高斯混合模型(GMM)的数组,通常初始化为 np.zeros((1, 65), np.float64)。
iter_count: 迭代优化的次数。GrabCut 算法会在每次迭代中更新 GMM 参数和像素标签,更高的迭代次数可能会得到更好的结果,但也会增加计算时间。
mode: GrabCut 算法的运行模式。以下是两种可能的模式:
cv2.GC_INIT_WITH_RECT: 使用矩形框初始化 GrabCut,这是最常用的模式。
cv2.GC_INIT_WITH_MASK: 使用掩码初始化 GrabCut,在这种情况下,掩码应该已经包含了用户提供的初步前景和背景信息。

函数返回两个值:

retval: 表示算法是否成功执行。
mask: 更新后的掩码图像,其中包含了最终的分割结果。掩码中的值将被更新为以下几种:
0: 背景像素
1: 前景像素
2: 可能背景像素
3: 可能前景像素

使用代码:

python">import numpy as np
import cv2
from matplotlib import pyplot as plt# 读取图像
img = cv2.imread(r'D:\AI_tool\GFPGAN-master\R-C (3).jfif')
# 将图像转换为RGB格式,以便在matplotlib中显示
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 定义矩形区域,GrabCut需要这个来初始化
# rect = (x, y, width, height)
rect = (50, 50, img.shape[1] - 100, img.shape[0] - 100)# 创建一个掩码,用于GrabCut算法
# 初始化掩码为全零矩阵,前景和背景由GrabCut算法更新
mask = np.zeros(img.shape[:2], np.uint8)# 创建前景和背景模型,算法内部使用
bgd_model = np.zeros((1, 65), np.float64)
fgd_model = np.zeros((1, 65), np.float64)# 使用GrabCut算法进行图像分割
cv2.grabCut(img, mask, rect, bgd_model, fgd_model, 5, cv2.GC_INIT_WITH_RECT)# 更新掩码,将0和2转换为0(背景),将1和3转换为1(前景)
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')# 将掩码应用到图像上,得到分割后的前景
img_rgb_fg = img_rgb * mask2[:, :, np.newaxis]# 显示原始图像和分割后的前景
plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.imshow(img_rgb)
plt.title('Original Image')
plt.axis('off')plt.subplot(122)
plt.imshow(img_rgb_fg)
plt.title('Foreground')
plt.axis('off')plt.show()

三、效果:

在这里插入图片描述


http://www.ppmy.cn/embedded/119235.html

相关文章

矩阵SVD分解中u,s,v的实际意义

在矩阵的奇异值分解(SVD, Singular Value Decomposition)中,U、S、V分别具有特定的实际意义,这些意义与矩阵的线性变换、特征提取、数据压缩等方面紧密相关。以下是对U、S、V实际意义的详细阐述: 1. U矩阵的实际意义 …

【AI大模型】Prompt Engineering

Prompt Engineering LLM 时代 prompt 这个词对于每个使用者和开发者来说已经听得滚瓜烂熟,那么到底什么是 prompt 呢?简单来说,prompt(提示)就是用户与大模型交互输入的代称。即我们给大模型的输入称为 Prompt&#x…

心觉:如何重塑高效学习的潜意识(4)发挥边学边用的威力

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作183/1000天 上篇文章我们讲了如何破解“想系统化学习一套理论,但是实力不允许”的情况 比如,你想系统学习…

react是一种语言?

React 不是一种编程语言,而是一种用于构建用户界面的 JavaScript 库。它由 Facebook 开发,并广泛用于开发单页应用程序(SPA)。React 允许你将 UI 拆分成独立的、可复用的组件,这些组件可以接收输入(称为“p…

使用AT command 修改手机APN

文章目录 使用AT command 修改手机APN其他AT command 使用AT command 修改手机APN 首先通过设备管理器查找到手机所使用的串口号。 然后通过putty 等串口连接软件,以telnet的方式连接手机。 连接成功后先,查看手机的 APN: ATCGDCONT可以用于…

picgo + typora + gitee图床

Picgo打造个人图床,稳定又安全 解决Typora笔记上传到CSDN图片无法显示的问题 typora中

阿里rtc旁路推流TypeScript版NODE运行

阿里云音视频服务云端录制typescript版本; 编译后可以使用 node index.js运行 package.json 版本 // npm install --save alicloud/rtc201801112.3.0 "alicloud/rtc20180111": "^2.3.0",引入 import Client, { StartCloudRecordRequest, StopCloudRecord…

Vue3:快速生成模板代码

目录 一.模板代码 1.提供基础结构 2.定义组件名称 3.初始化数据和方法 4.应用样式 5.提高开发效率 二.操作 1.点击右下角设置按钮选择代码片段 2.输入vue.json,打开vue.json文件 3.构造模板 4.模板代码 5.使用 6.效果 一.模板代码 Vue3快速生成模板代…