使用 OpenCV 和 GrabCut 算法进行交互式背景去除
一、说明
二、GrabCut 介绍
GrabCut 是一种计算机视觉算法,用于从图像中提取对象。因为它并不总是第一次工作,所以交互式GrabCut允许用户指示如何提高输出。在网络上,有几个GrabCut实现;有些只在Python中运行(没有Web界面),而另一些则不是交互式的。
2.1 使用GrabCut的过程是什么?
1. 用户进入矩形。此矩形之外的所有内容都将被视为背景。矩形内的一切都是一个谜。
2.算法标记前景和背景中的像素(或硬标记)
3. 然后使用高斯混合模型 (GMM) 对前景和背景进行建模。
4. GMM根据我们提供的数据学习并创建新的像素分布。换句话说,未知像素根据它们与其他硬标记像素的颜色统计关系被标记为可能的前景或可能的背景(就像聚类一样)。
5. 此像素分布用于创建图形。像素是图形中的节点。添加了两个新节点:“源”节点和“接收器”节点。每个前景像素都链接到一个源节点。

信用 researchgate.net
2.2 如何使用GrabCut的包
2.2.1 第 1 步:导入必要的包
首先,我们必须导入必要的包并覆盖我们的 matplotlib 函数。
代码片段:
import cv2
import dlib
import sys
import numpy as np
from tkinter import filedialog
from matplotlib import pyplot as pltdef imshow(title = "Image", image = None, size = 10):w, h = image.shape[0], image.shape[1]aspect_ratio = w/hplt.figure(figsize=(size * aspect_ratio,size))plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title(title)plt.show() 2.2.2 第 2 步:选择投资回报率函数
我们可以使用此 OpenCV 方法从图片中仔细手动选择我们需要的感兴趣区域。
原始照片

致谢 Eskipaper.com
img = r"C:\Users\jinzh\Desktop\Project\Python\python-opencv\lovely-girl-background-1.jpg"image = cv2.imread(img)
copy = image.copy()
# Create a mask (of zeros uint8 datatype) that is the same size (width, height) as our original image
mask = np.zeros(image.shape[:2], np.uint8)bgdModel = np.zeros((1,65), np.float64)
fgdModel = np.zeros((1,65), np.float64)x, y , w, h = cv2.selectROI("select the area", image)start = (x, y)
end = (x + w, y + h)rect = (x, y , w, h)
cv2.rectangle(copy, start, end, (0,0,255), 3)
imshow("Input Image", copy) 输出

生成自 Jupyter Notebook(作者)
2.2.3 第 3 部分 抓取切割算法算法:
抓取参数
1. img — 输入图像
2. 蒙版 — 这是一个蒙版图像,用于指定哪些部分是背景、前景或可能的背景/前景等。标志cv.GC_BGD、cv.GC_FGD、cv.GC_PR_BGD、cv.GC_PR_FGD,或者只是传递 0,1,2,3 以映像完成此操作。
3. rect — 在格式中,它是包含前景对象 (x,y,w,h) 的矩形的坐标
4. bdgModel 和 fgdModel — 由算法在内部使用。你只需要创建两个 np.float64 类型的零数组,每个数组的大小为 np.float64 (1,65)。
5. iterCount — 算法应运行的迭代次数。
6. mode — 这应该是cv.GC_INIT_WITH_RECT的、cv.GC_INIT_WITH_MASK的或混合的,这取决于我们是在绘制矩形还是画龙点滴。
cv2.grabCut(image, mask, rect, bgdModel, fgdModel, 100, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
image = image * mask2[:,:,np.newaxis]imshow("Mask", mask * 80)
imshow("Mask2", mask2 * 255)
imshow("Image", image) 解释
1. 运行算法 5 次迭代。因为我们使用的是矩形,所以模式应该是cv.GC_INIT_WITH_RECT的。
2.遮罩图像由Grabcut修改。
3. 如上所述,新蒙版图像中的像素将标有四个标志,表示背景/前景。
4.因此,我们更改了蒙版,使所有0和2像素都设置为0(背景),所有1和3像素都设置为1。(即前景像素)。
5. 我们最后一个面具现在已经完成。要获得分割的图像,只需将其乘以输入图像即可。
输出

生成自 Jupyter Notebook(作者)
你。我们终于能够删除背景。
三、参考和引用
- "GrabCut" | ACM SIGGRAPH 2004 Papers
- OpenCV: Interactive Foreground Extraction using GrabCut Algorithm
相关文章:
使用 OpenCV 和 GrabCut 算法进行交互式背景去除
一、说明 我想,任何人都可以尝试从图像中删除背景。当然,有大量可用的软件或工具能够做到这一点,但其中一些可能很昂贵。但是,我知道有人使用窗口绘画3D魔术选择或PowerPoint背景去除来删除背景。 如果您是计算机视觉领域的初学者…...
在Windows server 2012上使用virtualBox运行CentOS7虚拟机,被强制休眠(二)
问题场景 本月7月10日处理了一个虚拟机被强制暂停的问题,详见:在Windows server 2012上使用virtualBox运行CentOS7虚拟机,被强制暂停当时是由于C盘存储空间不足,导致虚拟机被强制暂停,将虚拟机迁移后,问题…...
sql学习笔记
sql语句优先级 FROM → WHERE → GROUP BY → SELECT → HAVING → ORDER BY sql case用法 例题: 按照销售单价( sale_price )对练习 3.6 中的 product(商品)表中的商品进行如下分类。 低档商品:销售单价在1000日元以下&#x…...
Ubuntu 20.04.4 LTS安装Terminator终端(Linux系统推荐)
Terminator终端可以在一个窗口中创建多个终端,并且可以水平、垂直分割,运行ROS时很方便。 sudo apt install terminator这样安装完成后,使用快捷键Ctrl Alt T打开的就是新安装的terminator终端,可以使用以下方法仍然打开ubuntu默…...
22. 括号生成
题目描述 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:["((()))","(()())","(())()","()(())",&…...
WPF实战学习笔记05-首页界面
首页界面 新建文件 添加文件[类型:用户控件] ./Common/Models/TaskBars.cs ./Common/Models/ToDoDto.cs ./Common/Models/MemoDto.cs 新建类 TaskBars.cs using System; using System.Collections.Generic; using System.Linq; using Sy…...
一文带你迅速入门SprIngMVC,看这一篇就足够了!
0. 什么是SpringMVC 要知道什么是SpringMVC,我们首先得知道什么 MVC,MVC是软件工程中的一种架构模式,分为 Model、View、Control。它把软件系统分为模型、视图和控制器三个基本部分。 Model:模型,应用程序负责数据逻…...
js路由跳转时放弃正在pending的请求
在单页面应用中通常会对请求进行catch处理,如果用户打开a页面后页面发出了一个请求去获取aaa,但是由于某种原因请求一直在pending。此时用户又进入了b页面,在浏览时a页面的请求失败了,然后页面弹出提示:“数据aaa请求失…...
LeetCode(sql)-0723
聚合函数 620 select * from cinema where mod(id,2)1 and description <> boring order by rating desc1251 select p.product_id, Round(sum(price*units)/sum(units),2)as average_price from UnitsSold u left join Prices p using(product_id) where purchase_d…...
【C++】开源:grpc远程过程调用(RPC)配置与使用
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍grpc远程过程调用(RPC)配置与使用。 无专精则不能成,无涉猎则不能通。。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜…...
rabbitmq模块启动报java.net.SocketException: socket closed的解决方法
问题 最近在接手一个项目时,使用的是spring-cloud微服务构架,mq消息消费模块是单独一个模块,但启动这个模块一直报如下错误: java.net.SocketException: socket closed 这个错误是这个模块注册不到nacos报的错,刚开…...
uni-app 中定时器的使用
学习目标: 学习目标如下所示: uniapp中通过使用uni-app提供的定时器API来实现定时器功能。 学习内容: 内容如下所示: **uni-app的定时器API分为两种: 1.第一种方式: setTimeout函数,用于设置一…...
基于物联网、视频监控与AI视觉技术的智慧电厂项目智能化改造方案
一、项目背景 现阶段,电力行业很多企业都在部署摄像头对电力巡检现场状况进行远程监控,但是存在人工查看费时、疲劳、出现问题无法第一时间发现等管理弊端,而且安全事件主要依靠人工经验判断分析、管控,效率十分低下。 为解决上述…...
内网穿透远程查看内网监控摄像头
内网穿透远程查看内网监控摄像头 在现代社会中,大家总是奔波于家和公司之间。大部分时间用于工作中,也就很难及时知晓家中的动态情况,对于家中有老人、小孩或宠物的(甚至对居住环境安全不放心的),这已然是…...
【Flume 01】Flume简介、部署、组件
1 Flume简介 Flume是一个高可用、高可靠、分布式的海量日志采集、聚合和传输的系统 主要特性: 它有一个简单、灵活的基于流的数据流结构(使用Event封装)具有负载均衡机制和故障转移机制一个简单可扩展的数据模型(Source、Channel、Sink) Sou…...
三款即时通讯工具推荐:J2L3x、Telegram、WhatsApp 你选哪个?
1、J2L3x J2L3x 是一款受欢迎的即时通讯工具,广泛应用于企业团队之间的沟通和协作。它提供了多种通讯方式,包括群组聊天、私人消息和文件共享等,还可以方便地与其他应用程序和服务集成。即使你不在工作场所,你也可以在任何地方使…...
C++ 单例模式(介绍+实现)
文章目录 一. 设计模式二. 单例模式三. 饿汉模式四. 懒汉模式结束语 一. 设计模式 单例模式是一种设计模式 设计模式(Design Pattern)是一套被反复使用,多数人知晓的,经过分类的,代码设计经验的总结。 为什么要有设计模式 就像人类历史发展会…...
uniapp项目集成本地插件
在项目根目录下创建nativeplugins文件夹 拷贝插件到目录nativeplugins 在manifest.json -> App原生插件配置 -> 本地插件里勾选插件 删除本地基座和手机app从新自定义基座运行...
MFC CList 类的使用
MFC提供CList 类; 类CList支持可按顺序或按值访问的非唯一对象的有序列表;CList 列表与双链接列表行为相似; 类型POSITION的变量是列表的关键字;可使用POSITION变量作为循环因子来顺序遍历列表,作为书签来保存位置&am…...
iptable防火墙
防火墙 防火墙的主要功能是隔离,决定数据是否可以被外网访问以及哪些数据可以进入内。 它主要部署在网络边缘或者主机边缘,应用在网络层。 防火墙的安全技术: 1、入侵检测系统:检测数威胁,病毒,木马,不…...
终极指南:如何使用Python实现同花顺自动化程序交易
终极指南:如何使用Python实现同花顺自动化程序交易 【免费下载链接】jqktrader 同花顺自动程序化交易 项目地址: https://gitcode.com/gh_mirrors/jq/jqktrader 在量化投资领域,自动化交易已成为专业投资者的标准配置。本文将详细介绍如何利用jqk…...
从Java到AI Agent:传统后端工程师的下一站,不是学AI,是成为系统工程师!
文章探讨了在AI技术发展的背景下,传统后端工程师的转型方向。作者认为,未来的竞争焦点不再是单纯的技术能力,而是如何将AI技术融入现有系统,构建自动化系统。文章提出了AI Agent工程师的概念,强调系统工程能力的重要性…...
Comsol 脉冲激光诱导等离子体仿真模型:探索微观世界的奇妙之旅
Comsol脉冲激光诱导等离子体仿真模型 利用脉冲激光作为热源,在氩气环境中诱导产生等离子体,主要体现出等离子体的密度、等离子体温度等参数 可以为激光诱导等离子体提供准确的参考在科研与工程领域,对脉冲激光诱导等离子体的深入研究有着举足…...
为什么数据质量成为人工智能领域最重要的问题
简而言之:传统的基于人工编写规则和被动检查的数据质量体系,从未针对智能体人工智能进行设计。到2026年,当自主代理处理错误数据时,没有人会介入以发现问题。那些在人工智能领域取得成功的组织,并非从更好的模型入手&a…...
使用Alpine配置WSL ssh门户
1. 哑铃图是什么? 哑铃图(Dumbbell Plot),有时也称为DNA图或杠铃图,是一种用于比较两个相关数据点的可视化图表。 它源于人们对更有效数据比较方式的持续探索。 在传统的时间序列比较中,我们通常使用两条折…...
WarcraftHelper:魔兽争霸III性能优化终极指南 - 10分钟打造完美游戏体验
WarcraftHelper:魔兽争霸III性能优化终极指南 - 10分钟打造完美游戏体验 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸III作为经…...
Windows音频路由终极指南:如何免费实现应用程序级音频设备管理
Windows音频路由终极指南:如何免费实现应用程序级音频设备管理 【免费下载链接】audio-router Routes audio from programs to different audio devices. 项目地址: https://gitcode.com/gh_mirrors/au/audio-router 你是否曾遇到过这样的困扰:在…...
无人机飞控实战:四元数微分方程在PX4中的实现与调参技巧
无人机飞控实战:四元数微分方程在PX4中的实现与调参技巧 当无人机在复杂环境中执行高速机动时,传统欧拉角描述姿态会出现万向节锁死现象。去年调试一台行业级六旋翼时,就曾遇到俯仰角接近90时控制器突然发散的情况——这正是欧拉角奇异点的典…...
Netty ChannelPipeline 线程安全机制的深度解析
Netty ChannelPipeline 线程安全机制的深度解析 摘要 ChannelPipeline 作为 Netty 事件处理管道的核心抽象,其线程安全性的实现是 Netty 高性能、高并发架构的关键基础。Netty 通过精心设计的机制确保了 ChannelPipeline 所有公共方法的线程安全,主要包括…...
AI 模型推理 GPU 调度性能分析
AI模型推理GPU调度性能分析:解锁算力潜能的关键 随着AI技术的快速发展,深度学习模型的推理任务对计算资源的需求急剧增加。GPU因其并行计算能力成为模型推理的核心硬件,但如何高效调度GPU资源以提升性能,成为企业和研究机构关注的…...
