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

news2024/11/17 3:45:13

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

文章目录

  • 前言
  • 一、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实现:

在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: 可能前景像素

使用代码:

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.coloradmin.cn/o/2174667.html

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

相关文章

二维数组的使用

本章我将用自己的语言给大家翻译二维数组的使用,要是因为我阐述的不清晰,大家不懂的的可以直接在评论里问。 1.下标 二维数组的下标和一维数组没有多大的区别,唯一的区别就是,一维数组只有列,而二维数组还有行 一维数…

C高级(Day22)

一、学习内容 shell指令 文件相关的指令 重定向 > >> echo :打印字符串 cat: 在终端打印文件的内容 链接文件 硬链接文件:文件的inode号是一样的。 查看文件inode号: ls -i 格式:ln 被链接的文件 创建硬链接文件 1 硬链接的文件…

maven-web项目配置打包插件

maven-web项目配置打包 配置maven 打包插件 <!-- 打包 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.4</version><!-- <configuration><webRes…

c#使用winscp库实现FTP/SFTP/SCP的获取列表、上传和下载功能

网上写c#调用winscp实现的资料很少,且写的不够详细。本人查了下winscp的libraries说明,写了个小工具,供大家参考。 winscp的接口说明地址如下: WinSCP .NET Assembly and COM Library :: WinSCP 一、先展示一下小工具的界面 1、支持SFTP/FTP/SCP 2、支持文件夹、文件的…

UE4_Niagara基础实例—4、静态网格体表面生成粒子

效果图&#xff1a; 分析&#xff1a;在物体面上生成粒子&#xff0c;改变粒子的不透明度&#xff0c;让粒子收到力&#xff0c;并添加紊乱&#xff0c;类似于水蒸气。 操作步骤&#xff1a; 1、创建个niagara 系统&#xff0c;使用模版 simple sprite burst。简单调节参数。…

2024年【金属非金属矿山(地下矿山)安全管理人员】考试总结及金属非金属矿山(地下矿山)安全管理人员考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员考试总结根据新金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员考试大纲要求&#xff0c;安全生产模拟考试一点通将金属非金属矿山&#xf…

第五届计算机科学与管理科技国际学术会议(ICCSMT 2024)

梁哲&#xff0c;同济大学长聘特聘教授&#xff0c;国家杰青、首届国家杰青延续项目获得者、上海市曙光学者、上海市优秀学术带头人。本科毕业于新加坡国立大计算机工程系、硕士毕业于新加坡国立大学工业与系统工程系、博士毕业于美国新泽西州立大学工业工程系。理论研究主要集…

农牧场可视化管理:精准监测与优化运营

利用图扑可视化技术实现农牧场的实时数据监测和分析&#xff0c;优化资源配置&#xff0c;提高生产效率和可持续发展能力。

文件flac怎么转成mp3?这几种方法每个人都能学会!

文件flac怎么转成mp3&#xff1f;FLAC以其无损音频的卓越音质和精湛的压缩技术&#xff0c;在音乐发烧友与音频专业人士中赢得了无可撼动的地位&#xff0c;然而&#xff0c;任何技术的辉煌背后都伴随着其特有的挑战与考量&#xff0c;FLAC的显著特点就是无损压缩&#xff0c;虽…

360周鸿祎为什么说大模型已成茶叶蛋?

大模型炒了一年&#xff0c;为什么没有特别火的应用&#xff1f; 最近几天360创始人周鸿祎称&#xff0c;去年感觉大模型是原子弹&#xff0c;今年感觉是茶叶蛋。 什么意思&#xff1f;我想大概就是说大模型谁都能玩了&#xff0c;现在国内的大模型没有一千&#xff0c;也有几…

JAVA的版本

Java的版本开始还正常&#xff1a;1.0 ->1.1 顺序增加&#xff0c;到了2004年&#xff0c;不知什么原因1.5又有了新的平行名字5&#xff0c;这样Java 1.6对应Java6&#xff0c;一直到Java1.8 对应 Java8&#xff0c;然后到在2017年彻底没了Java1.9,只有Java9了。好吧这可以忍…

椭圆距离计算的简单方法

分析发现找到点到椭圆的最近距离等价于求解一元四次方程。想象一下一个圆和一个椭圆最多相交四次。从这个观点出发,问题转化为找到与椭圆仅相交一次的圆。如果用四次方程表示,其中两个根将在交点处共享,而另外两个根将会是复数。 尽管四次方程的封闭解确实存在,但迭代方法更…

言语理解(2)

B B出现在文章中的第一句话&#xff0c;属于转折前的内容非重点 在这一过程中&#xff0c;属于对前面的指代&#xff0c;后面可以引出文章中的中心内容 A D没有提及到农村&#xff0c;C选项和文段中的最后一句话是相契合的 B 色彩是文章中的主题词&#xff0c;不过属于转折&…

代码随想录算法训练营第59天|卡码网 47. 参加科学大会、94. 城市间货物运输 I

1. 卡码网 47. 参加科学大会 题目链接&#xff1a;https://kamacoder.com/problempage.php?pid1047 文章链接&#xff1a;https://www.programmercarl.com/kamacoder/0047.参会dijkstra堆.html#总结 思路依然是 dijkstra 三部曲&#xff1a; 1.第一步&#xff0c;选源点到哪个…

Hadoop HDFS命令操作实例

一.创建与查看HDFS目录 每次重启后&#xff0c;Jps和java -version执行出来的结果不符合就使用 source ~/.bash_profile 是在 Unix/Linux 系统上用来重新加载用户的 Bash 配置文件 ~/.bash_profile 的命令。这条命令的作用是使得当前的 Bash 环境重新读取并应用 ~/.bash_pro…

Android studio安装问题及解决方案

Android studio安装问题及解决方案 gradle已经安装好了&#xff0c;但是每次就是找不到gradle的位置&#xff0c;每次要重新下载&#xff0c;很慢&#xff0c;每次都不成功 我尝试用安装android studio时自带的卸载程序&#xff0c;卸载android studio&#xff0c;然后重新下…

Centos8.5.2111(2)之基于docker容器的SELinux及防火墙配置与管理

对于Linux服务器而言&#xff0c;常用netfilter/iptables数据包过滤系统。Centos 8采用了firewalld取代了iptables。firewalld和iptables其实都不是真正的防火墙&#xff0c;只是定义策略的防火墙工具而已。 SELinux全称为“Security-Enhanced Linux”&#xff0c;是安全增强型…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——15.红黑树

1.红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c;…

产品包装检测系统源码分享

货架产品包装检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

Java文件I/O处理之RandomAccessFile【随意存取文件】

Java语言有一个处理文件输入输出的RandomAccessFile类&#xff0c;既可以读取文件内容&#xff0c;也可以向文件输出数据。 RandomAccessFile类在国内的技术文档和书籍中都翻译为“随机访问文件”类&#xff0c;确实令人不解。 在中文中“随机”的意思&#xff1a; 不设任何条…