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 pltimg = 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] = 1mask, 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函数。

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

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

相关文章

内存马浅析

之前在jianshu上写了很多博客,但是安全相关的最近很多都被锁了。所以准备陆陆续续转到csdn来。内存马前几年一直是个很热门的漏洞攻击手段,因为相对于落地的木马,无文件攻击的内存马隐蔽性、持久性更强,适用的漏洞场景也更多。 J…

串口接收,不定长数据接收

###1.CUBE-MX配置串口 2.我采用串口中断接收,打开中断接口 3.时钟同样8倍频,1分频,使用内部时钟 打开串口中断 main() { __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); // 启用空闲中断__HAL_UART_ENABLE_IT(&huart1, UART_IT_R…

CentOS 7 更换软件仓库

CentOS 7 于2024年6月30日停止维护,官方仓库已经没有软件了,想要继续使用 ,需要更换软件仓库,这里更换到阿里云的软件仓库 https://developer.aliyun.com/mirror/ 查看目前可用的软件数量 yum repolist 更换软件仓库&#xff1a…

Gorilla Mk1机器人:CubeMars电机加持,助力高空作业新突破

在澳大利亚输电网络的高空作业领域,一款由Crest Robotics研发的创新机器人正悄然改变着工作方式。这款名为Gorilla Mk1的机器人,凭借先进的技术和精密的动力系统,在高压输电线路的维护和检修作业中提供了前所未有的安全性和高效性。而这背后&…

DDRPHY数字IC后端设计实现系列专题之后端设计导入,IO Ring设计

本章详细分析和论述了 LPDDR3 物理层接口模块的布图和布局规划的设计和实 现过程,包括设计环境的建立,布图规划包括模块尺寸的确定,IO 单元、宏单元以及 特殊单元的摆放。由于布图规划中的电源规划环节较为重要, 影响芯片的布线资…

Pinia-状态管理

Pinia-状态管理 特点: 1. 轻量和模块化 Pinia 是一个轻量级的状态管理库,支持模块化管理,即可以将应用的状态分成多个 store 以实现更好的组织。使用 Pinia,可以定义多个 store,每个 store 都是一个独立的模块&#x…

WPF界面控件Essential Studio for WPF更新至2024 v3,具有更高性能 | 附下载

Essential Studio for WPF界面控件包含了利于分析且高性能的Windows应用程序开发中所需的所有控件,如 grids、charts、gauges、menus、calendars、editors等等。同时,我们的文件格式库还允许您导出资料到Excel、World和PDF文件中,以及对这些格…

相关衍生 pika+mongo

衍生相关 pikamongo 很多平台不提供完整的数据展示, 翻页只能翻几页,不过提供相关推荐等方法可获取更多的数据; 使用 rabbitmq 是因为数据量可能有几十上百万, 且能持久化 mongo对于数据并不实时的更新到查询里 def main():# mongodb# client MongoClient(localhost, 27017)cl…

软件测试--BUG篇

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

【Linux】————进程间通信(匿名管道)

作者主页: 作者主页 本篇博客专栏:Linux 创作时间 :2024年6月20日 进程间通信的目的: 数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享资源通知事件:一个进程需…

Android [调试方法]如何在编译日志中快速找出报错信息

问题描述: 在进行Android完整编译时,经常遇到各种编译导致编译失败的情况,但其日志信息的打印数量十分巨大,无法仔细阅读逐行阅读。对于不熟悉的方法的同学定位报错问题的位置往往需要耗费较长时间。因此本作者将较为典型的方法总…

论文阅读:Computational Long Exposure Mobile Photography (一)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章,介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像,用运动模糊来呈现场景中的移动元素。它通常有两种模式,分别产生前景模糊或…

将 IBM WatsonX 数据与 Milvus 结合使用,构建用于知识检索的智能 Slack 机器人

在当今快节奏的工作环境中,快速轻松地访问信息对于保持生产力和效率至关重要。无论是在 Runbook 中查找特定说明,还是访问关键知识转移 (KT) 文档,快速检索相关信息的能力都可以产生重大影响。 本教程将指导您构建一个…

法律智能助手:开源NLP系统助力法律文件高效审查与检索

一、系统概述 思通数科AI平台是一款融合了自然语言处理和多标签分类技术的开源智能文档分类工具,特别适用于法律行业。平台采用深度学习的BERT模型来进行特征提取与关系抽取,实现了精准的文档分类和检索。用户可以在线训练和标注数据,使系统…

在linux系统中安装pygtftk软件

1.下载和安装 网址&#xff1a; https://dputhier.github.io/pygtftk/index.html ## 手动安装 git clone http://gitgithub.com:dputhier/pygtftk.git pygtftk cd pygtftk # Check your Python version (>3.8,<3.9) pip install -r requirements.txt python setup.py in…

Kubernetes:(三)Kubeadm搭建K8s 1.20集群

文章目录 一、Kubeadm安装流程二、实验1.环境准备2.所有节点安装kubeadm&#xff0c;kubelet和kubectl&#xff08;除了Harbor节点&#xff09;3.部署 Dashboard4.安装Harbor私有仓库 一、Kubeadm安装流程 集群名称IP地址安装软件master&#xff08;2C/4G&#xff0c;cpu核心数…

前端之html(二)加入css开篇(一)

1.lebal标签-增大点击范围 性别:<input type"radio" name"gender" id"man"><lebal for"man">男</lebal> <lebal><input type"radio" name"gender" id"nv">女</leba…

记一次:Clickhouse同步mysql数据库

ClickHouse可以通过使用MaterializeMySQL引擎来实现与MySQL的数据同步。 前言&#xff1a;因为数据量比较大&#xff0c;既然要分库&#xff0c;为何不让clickhouse同步一下mysql数据库呢&#xff1f; 零、前期准备--mysql的查询和配置 1 查询mysql的配置状态 查询以下语句…

Rust 力扣 - 1984. 学生分数的最小差值

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 原数组 nums 排序&#xff0c;遍历nums中下标为[0, nums.len() - k]的学生分数 假设当前遍历的下标为i则&#xff0c;以 i 下标为最小值的学生分数的最小差值为nums[i k - 1] - nums[i] 取最小差值的最小值即…

10个领先的增强现实平台【AR】

增强现实 (AR) 被描述为一种通过计算机生成的内容增强现实世界的交互式体验。 使用软件、应用程序和硬件&#xff08;例如 AR 眼镜&#xff09;&#xff0c;AR 能够将数字内容叠加到现实环境和物体上。早在 2024 年&#xff0c;许多像 Apple 这样的公司就已进入 VR/AR 市场&am…