opencv - py_imgproc - py_grabcut GrabCut 算法提取前景

文章目录

  • 使用 GrabCut 算法进行交互式前景提取
    • 目标
    • 理论
    • 演示

使用 GrabCut 算法进行交互式前景提取

目标

在本章中

  • 我们将了解 GrabCut 算法如何提取图像中的前景
  • 我们将为此创建一个交互式应用程序。

理论

GrabCut 算法由英国剑桥微软研究院的 Carsten Rother、Vladimir Kolmogorov 和 Andrew Blake 设计。在他们的论文 “GrabCut”:使用迭代图切割进行交互式前景提取 中。需要一种以最少的用户交互进行前景提取的算法,结果就是 GrabCut。

从用户的角度来看它是如何工作的?首先,用户在前景区域周围绘制一个矩形(前景区域应完全在矩形内)。然后算法迭代地对其进行分割以获得最佳结果。完成。但在某些情况下,分割效果并不好,例如,它可能将某些前景区域标记为背景,反之亦然。在这种情况下,用户需要进行精细的修饰。只需在存在错误结果的图像上进行一些描边即可。描边基本上表示“嘿,这个区域应该是前景,你将其标记为背景,在下一次迭代中对其进行更正”*或将其相反标记为背景。然后在下一次迭代中,您会得到更好的结果。

参见下图。第一个球员和足球被包裹在一个蓝色矩形中。然后用白色描边(表示前景)和黑色描边(表示背景)进行一些最后的修饰。我们得到了一个不错的结果。

在这里插入图片描述

那么背景会发生什么?

  • 用户输入矩形。此矩形之外的所有内容都将被视为确定的背景(这就是之前提到您的矩形应包含所有对象的原因)。矩形内的所有内容都是未知的。同样,任何指定前景和背景的用户输入都被视为硬标记,这意味着它们不会在此过程中发生变化。
  • 计算机根据我们提供的数据进行初始标记。它标记前景和背景像素(或硬标记)
  • 现在使用高斯混合模型 (GMM) 来建模前景和背景。
  • 根据我们提供的数据,GMM 学习并创建新的像素分布。也就是说,未知像素根据其与其他硬标记像素在颜色统计方面的关系被标记为可能的前景或可能的背景(这就像聚类)。
  • 根据此像素分布构建图形。图中的节点是像素。添加了另外两个节点,源节点接收器节点。每个前景像素都连接到源节点,每个背景像素都连接到接收器节点。
  • 将像素连接到源节点/端节点的边的权重由像素为前景/背景的概率定义。像素之间的权重由边缘信息或像素相似性定义。如果像素颜色差异很大,则它们之间的边缘将获得较低的权重。
  • 然后使用最小切割算法对图形进行分割。它将图形切成两个分离的源节点和接收器节点,具有最小成本函数。成本函数是所有被切割边的权重之和。切割后,所有连接到源节点的像素都变为前景,而连接到接收器节点的像素都变为背景。
  • 该过程持续进行,直到分类收敛。

如下图所示(图片来源:http://www.cs.ru.ac.za/research/g02m1682/)

在这里插入图片描述

演示

现在我们使用 OpenCV 进行 grabcut 算法。OpenCV 有函数 cv.grabCut() 用于此目的。我们
首先将看到它的参数:

  • img - 输入图像
  • mask - 这是一个掩码图像,我们指定哪些区域是背景、前景或可能的背景/前景等。它通过以下标志完成,cv.GC_BGD、cv.GC_FGD、cv.GC_PR_BGD、cv.GC_PR_FGD,或者简单地将 0、1、2、3 传递给图像。
  • rect - 它是包含前景对象的矩形的坐标,格式为 (x,y,w,h)
  • bdgModelfgdModel - 这些是算法内部使用的数组。您只需创建两个大小为 (1,65) 的 np.float64 类型零数组。
  • iterCount - 算法应运行的迭代次数。
  • mode - 它应该是 cv.GC_INIT_WITH_RECTcv.GC_INIT_WITH_MASK 或两者结合
    决定我们绘制的是矩形还是最终的修饰笔触。

首先让我们看看矩形模式。我们加载图像,创建一个类似的遮罩图像。我们创建 fgdModelbgdModel。我们给出矩形参数。这一切都很简单。让算法运行 5 次迭代。模式应该是cv.GC_INIT_WITH_RECT,因为我们使用的是矩形。然后运行 ​​grabcut。它会修改遮罩图像。在新的遮罩图像中,像素将用四个标志标记,表示如上所述的背景/前景。因此,我们修改了掩码,将所有 0 像素和 2 像素都设置为 0(即背景),将所有 1 像素和 3 像素都设置为 1(即前景像素)。现在我们的最终掩码已准备就绪。只需将其与输入图像相乘即可获得分割后的图像。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('messi5.jpg')
mask = np.zeros(img.shape[:2],np.uint8)

bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)

rect = (50,50,450,290)
cv.grabCut(img,mask,rect,bgdModel,fgdModel,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.colorbar(),plt.show()

请参阅以下结果:

在这里插入图片描述

哎呀,梅西的头发不见了。*谁会喜欢没有头发的梅西?*我们需要把它带回来。所以我们将用 1 像素(确定的前景)进行精细修饰。同时,一些我们不想要的地面部分出现在图片中,还有一些徽标。我们需要移除它们。我们在那里进行一些 0 像素修饰(确定的背景)。所以我们修改了前面案例中得到的蒙版,就像我们现在所说的那样。

我实际上做的是,我在绘画应用程序中打开输入图像,并在图像上添加了另一个图层。使用绘画中的画笔工具,我在这个新图层上用白色标记错过的前景(头发、鞋子、球等),用黑色标记不需要的背景(如徽标、地面等)。然后用灰色填充剩余的背景。然后在 OpenCV 中加载该蒙版图像,使用新添加的蒙版图像中的相应值编辑我们获得的原始蒙版图像。检查下面的代码:

# newmask is the mask image I manually labelled
newmask = cv.imread('newmask.png',0)

# wherever it is marked white (sure foreground), change mask=1
# wherever it is marked black (sure background), change mask=0
mask[newmask == 0] = 0
mask[newmask == 255] = 1

mask, bgdModel, fgdModel = cv.grabCut(img,mask,None,bgdModel,fgdModel,5,cv.GC_INIT_WITH_MASK)

mask = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask[:,:,np.newaxis]
plt.imshow(img),plt.colorbar(),plt.show()

请参阅以下结果:

在这里插入图片描述

就是这样。在这里​​,您可以直接进入掩码模式,而不是在矩形模式下初始化。只需用 2 像素或 3 像素(可能的背景/前景)标记掩码图像中的矩形区域。然后用 1 像素标记我们的 sure_foreground,就像我们在第二个示例中所做的那样。然后直接在掩码模式下应用 grabCut函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/907835.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android编译环境构建(二)(可用于物理机、虚拟机、容器化Jenkins环境)

文章目录 需求环境要求文件下载Gradle Version:7.5cmdline-tools至此普通物理环境的Android编译环境已部署完毕 部署maven(可选)Jenkins配置Android构建环境 说明: 物理环境:物理机、虚拟机等 容器化环境:docker等 需求 Gradle Version:7.5 …

Django安装

在终端创建django项目 1.查看自己的python版本 输入对应自己本机python的版本,列如我的是3.11.8 先再全局安装django依赖包 2.在控制窗口输入安装命令: pip3.11 install django 看到Successflully 说明我们就安装成功了 python的Scripts文件用于存…

【免费】跟网型逆变器小干扰稳定性分析与控制策略优化

目录 主要内容 模型研究 数学模型 2.小信号控制结构 3.仿真模型 结果一览 下载链接 主要内容 弱电网往往具有阻抗较大和短路比较小等特点,易导致系统不稳定,限制了功率传输能力。该仿真建立了弱电网下跟网型逆变器的小信号扰动状态空间模…

aws(学习笔记第十课) 对AWS的EBS如何备份(snapshot)以及使用snapshot恢复数据,AWS实例存储

aws(学习笔记第十课) 对AWS的EBS如何备份(snapshot)以及使用snapshot,AWS实例存储 学习内容: 对AWS的EBS如何备份AWS实例存储EBS和实例存储的不足 1. 对AWS的EBS如何备份(snapshot)以及使用snapshot恢复数…

开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序中积分使用价值的拓展策略

摘要:本文围绕开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序,深入探讨其积分使用价值的丰富策略。详细分析积分兑换礼品、会员升级、积分抵现等方式在该特定商城小程序环境下的应用特点、存在问题及对用户和商城的影响,旨在为商城的优化运…

async函数和await表达式

async函数 函数的返回值为promise对象 promise对象的结果由async函数执行的返回值决定 async函数的返回值 和then方法的返回值以及返回类型的判断办法一致 如果返回值是一个非promise类型的数据 返回的promise的类型为fulfilled或者resolved 如果返回的是一个promise对象 …

软件测试--BUG篇

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 目录 1. 软件测试的⽣命周期 2. BUG 1. BUG 的概念 2. 描述bug的要素 3.bug级别 4.bug的⽣命周期 5 与开发产⽣争执怎…

Linux云计算 |【第五阶段】CLOUD-DAY8

主要内容: 掌握DaemonSet控制器、污点策略(NoSchedule、Noexecute)、Job / CronJob资源对象、掌握Service服务、服务名解析CluterIP(服务名自动发现)、(Nodeport、Headless)、Ingress控制器 一…

基于java+SpringBoot+Vue的新闻推荐系统设计与实现

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

我主编的电子技术实验手册(22)——RC并联电路

本专栏是笔者主编教材(图0所示)的电子版,依托简易的元器件和仪表安排了30多个实验,主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】,精心设计的【实验步骤】,全面丰富的【思考习…

设备树基本语法

文章目录 设备树基本语法跟节点子节点reg属性address-cells 和 size-cells 属性model 属性status 属性compatible 属性aliases 节点chosen 节点device_type 节点自定义属性 当描述设备树(Device Tree) 时, 通常会涉及到以下几个关键术语&…

【环境搭建】Apache Kylin 各个版本Docker搭建汇总

前言 最近需要做一些Web漏洞复现的研究,所以需要搭建不同版本的Apache Kylin,在这里汇总一下。 用Docker来搭建环境是最简单的方式,因为无需在本地构建镜像,只需执行以下命令直接从 Docker Hub 拉取镜像,当容器启动时…

linux操作系统进程

linux操作系统是对下的软硬件进行管理,为了能够对上提供稳定,快速,安全的服务而诞生的软件。 广义上的操作系统是包含搭载在操作系统上的软件和函数库等文件的。 狭义上的操作系统就是操作系统内核,进行进程管理,文件…

CentOS9 Stream 支持输入中文

CentOS9 Stream 支持输入中文 方法一:确保 gnome-control-center 和相关组件已更新方法二:手动添加输入法源配置方法三:配置 .xinputrc 文件方法四:检查语言包 进入centos9 stream后,点击右上角电源键,点击…

Linux权限管理和文件属性

目录 1. 权限的概念 2. 权限管理 2.1 文件访问者的分类 2.2 文件类型和访问权限(事物属性) 2.2.1 文件类型 2.2.2 file指令 2.2.3 基本权限 3. 文件访问权限的相关设置方法 3.1 chmod 3.2 chown 和 chgrp 3.3 umask 4. 粘滞位 1. 权限的…

某些保护措施如反接保护漏电保护为什么用可控硅而不用MOS管

现在很多人了解到MOS的饱和导通时电阻很小。 不过MOS的导通有条件,就是GS电压要求比较高。 在保护方面,我们需要 1,简单可靠,务必不要太复杂 2,触发电压要低,电流要求要小,否则灵敏度达不到…

【力扣专题栏】字母异词分组,如何利用强大的容器(unordered_map)解决该问题?

题解目录 1、题目描述解释2、算法原理解析3、代码编写 1、题目描述解释 2、算法原理解析 3、代码编写 class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {//创建哈希表unordered_map<string,vector<string&g…

debian11安装最新rabbitmq

1、使用官网提供系统对应的安装脚本 安装 版本说明&#xff1a; Debian Buster代表Debian 10 Debian Bullseye代表Debian 11 Debian Bookworm代表Debian 12 ‌Debian Trixie代表Debian 13 Debian Sid代表Debian unstable版本 2、新建脚本文件 vim rabbitMq.sh将脚本内容复制到…

K 临近算法

机器学习中的 K 临近算法&#xff0c;计算输入数据与训练集中数据的距离&#xff0c;选取 k 个最近的数据&#xff0c;选中的数据中&#xff0c;那个分类多&#xff0c;那个分类就是最终结果。特征空间的距离有多重测量方法&#xff0c;最常用的就是欧氏距离&#xff0c;公式如…

2025上海市公务员考试报名流程详细教程

2025年上海市公务员考试报名马上就要开始了&#xff0c;有想要参加上海公务员考试的姐妹们&#xff0c;可以提前了解一下考试报名流程&#xff0c;和报名照制作尺寸要求 报名时间&#xff1a;11月2日0:00至11月8日12:00 南核时间&#xff1a;11月2日0:00至11月8日14:00 缴费…