图像分割-Grabcut法
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
本文的C#版本请访问:图像分割-Grabcut法(C#)-CSDN博客
GrabCut是一种基于图像分割的技术,它可以用于将图像中的前景和背景分离。在实现中,GrabCut算法通常需要使用高斯混合模型(GMM)来建立前景和背景的概率分布,以便更好的估计像素的标签。同时,还需要考虑如何处理边界处的像素,以避免边界处的像素被错误地分类。GrabCut算法在图像分割中有着广泛的应用,例如人像分割、物体抠图等。
EmguCV使用CvInvoke.GrabCut方法来执行GrabCut算法,该方法声明如下:
Public Shared Sub GrabCut (
img As IInputArray,
mask As IInputOutputArray,
rect As Rectangle,
bgdModel As IInputOutputArray,
fgdModel As IInputOutputArray,
iterCount As Integer,
type As GrabcutInitType
)
参数说明:
- img:输入输出的图像,必须是三通道彩色图像。
- mask:指定的掩码图像,必须是单通道灰度图像,并且与输入图像具有相同的尺寸。可以传入0-3的值,分别为:0表示明显为背景的像素、1表示冥相位前景的像素、2表示可能为背景的像素、3表示可能为前景的像素。
- rect:指定的矩形框,用于定位大概率可能为前景目标的位置。
- bgdModel:背景模型,必须是单通道浮点型Mat。
- fgdModel:前景模型,必须是单通道浮点型Mat。
- iterCount:迭代次数,用于控制算法的收敛性。
- type:GrabCut算法初始化类型,可以选择GrabCutInitType.WithRect或GrabCutInitType.WithMask,分别表示根据提供的矩形初始化或根据掩码初始化。
该方法没有返回值,而是直接在mask图像上进行前景分割操作,最终获得的mask包含0-3的值,含义如参数中说明。
'Grabcut法 Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.ClickDim m As New Mat("C:\learnEmgucv\tower.jpg", ImreadModes.AnyColor)Dim result As New MatDim bg As New MatDim fg As New MatDim rect As New Rectangle(80, 30, 680, 450)CvInvoke.GrabCut(m, result, rect, bg, fg, 1, GrabcutInitType.InitWithRect)'输出的result只有4个值:'0:确定背景'1:确定前景'2:可能背景'3:可能前景'演示框选范围CvInvoke.Rectangle(m, rect, New MCvScalar(255, 255, 255), 1)ImageBox1.Image = m'标记区域Dim matr As New Matrix(Of Byte)(result.Rows, result.Cols)result.CopyTo(matr)For i As Integer = 0 To matr.Cols - 1For j As Integer = 0 To matr.Rows - 1'将确定背景和可能背景标记为0,否则为255If matr(j, i) = 0 Or matr(j, i) = 2 Thenmatr(j, i) = 0Elsematr(j, i) = 255End IfNextNextDim midm As New Matmidm = matr.Mat'显示标记的图像CvInvoke.Imshow("midm", midm)'灰度转为彩色Dim midm1 As New MatCvInvoke.CvtColor(midm, midm1, ColorConversion.Gray2Bgr)Dim mout As New Mat'And运算CvInvoke.BitwiseAnd(m, midm1, mout)CvInvoke.Imshow("mout", mout)
End Sub
输出结果如下图所示:

图8-5 Grabcut法分离前景
'Grabcut法 Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.ClickDim m As Mat = CvInvoke.Imread("C:\learnEmgucv\tower.jpg", CvEnum.ImreadModes.Color)Dim result As New MatDim bg As New MatDim fg As New MatDim rect As New Rectangle(80, 30, 680, 450)CvInvoke.GrabCut(m, result, rect, bg, fg, 5, CvEnum.GrabcutInitType.InitWithRect)Dim src As Image(Of Bgr, Byte) = m.ToImage(Of Bgr, Byte)Dim dst As New Image(Of Bgr, Byte)(New Size(src.Width, src.Height))Dim mask As Image(Of Gray, Byte) = result.ToImage(Of Gray, Byte)'直接操作Image像素点For i As Integer = 0 To src.Rows - 1For j As Integer = 0 To src.Cols - 1'如果是确定前景和可能前景,直接保留原像素点颜色,否则为黑色If mask.Data(i, j, 0) = 1 Or mask.Data(i, j, 0) = 3 Thendst.Data(i, j, 0) = src.Data(i, j, 0)dst.Data(i, j, 1) = src.Data(i, j, 1)dst.Data(i, j, 2) = src.Data(i, j, 2)Elsedst.Data(i, j, 0) = 0dst.Data(i, j, 1) = 0dst.Data(i, j, 2) = 0End IfNextNextImageBox1.Image = dst
End Sub
输出结果如下图所示:

图8-6 Grabcut法分离前景
'标记为确定前景,这里使用InitWithMask 参数Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.ClickDim m As New Mat("c:\learnEmgucv\lena.jpg", ImreadModes.AnyColor)Dim mask As New MatDim bg As New MatDim fg As New MatDim rect As New Rectangle(80, 30, 340, 480)'使用前景为全白色Dim m1 As New Mat("c:\learnEmgucv\lena_fillwhite.jpg", ImreadModes.Grayscale)Dim mask1 As New Mat'二值化CvInvoke.Threshold(m1, mask1, 250, 1, ThresholdType.Binary)CvInvoke.Rectangle(m, rect, New MCvScalar(255, 255, 255), 1)'标记之后再调用GrabCut,使用InitWithMask参数CvInvoke.GrabCut(m, mask1, rect, bg, fg, 2, GrabcutInitType.InitWithMask)Dim matrx As New Matrix(Of Byte)(mask1.Rows, mask1.Cols)mask1.CopyTo(matrx)For i As Integer = 0 To matrx.Cols - 1For j As Integer = 0 To matrx.Rows - 1If matrx(i, j) = 0 Or matrx(i, j) = 2 Thenmatrx(i, j) = 0Elsematrx(i, j) = 255End IfNextNextDim midm2 As New Matmidm2 = matrx.MatDim midm1 As New MatCvInvoke.CvtColor(midm2, midm1, ColorConversion.Gray2Bgr)Dim mout As New MatCvInvoke.BitwiseAnd(m, midm1, mout)CvInvoke.Imshow("mout", mout)
End Sub
输出结果如下图所示:

图8-7 Grabcut法分离前景
由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。
学习更多vb.net知识,请参看vb.net 教程 目录
相关文章:
图像分割-Grabcut法
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 本文的C#版本请访问:图像分割-Grabcut法(C#)-CSDN博客 GrabCut是一种基于图像分割的技术,它可以用于将图像…...
性能测试浅谈
早期的性能测试更关注后端服务的处理能力。 一个用户去访问一个页面的请求过程,如上图。 数据传输时间 当你从浏览器输入网址,敲下回车,开始... 真实的用户场景请不要忽视数据传输时间,想想你给远方的朋友写信,信件需…...
媒体运营常用的ChatGPT通用提示词模板
媒体平台选择:如何选择合适的媒体平台,确保内容的有效传播? 内容策划与创作:如何策划和创作高质量的内容,吸引和留住目标受众? 内容发布与推广:如何有效地发布和推广内容,提高内容…...
Java学习苦旅(二十一)——泛型
本篇博客将详细讲解Java中的泛型。 文章目录 泛型的定义语法示例 泛型类语法示例类型边界语法示例 类型擦除通配符语法示例上界语法示例 下界语法示例 裸类型泛型方法语法示例 泛型的限制结尾 泛型的定义 语法 class 泛型类名称<类型形参列表> {//这里可以使用类型参数…...
具备闭环思维的测试才更充分
测试工作的终极目标是为了保障产品的质量。如果用同一个维度衡量测试人员的业务水平,简单粗暴一些:那就是针对同一款产品,哪个测试人员发现的bug多,哪个测试人员的测试理论与实践水平相对来说还是高一些。 前两天组长在群里分析了…...
flask web学习之模板(一)
文章目录 一、模板基本用法1.1 定界符1.2 模板语法1.3 渲染模板 二、模板辅助工具2.1 上下文2.2 全局对象2.3 过滤器2.4 测试器2.5 模板环境对象 在动态web程序中,视图函数返回的HTML数据往往需要根据相应的变量(比如查询参数)动态生成。当HT…...
RedisInsight - Redis官方可视化工具
一、RedisInsight 简介 RedisInsight 是一个直观高效的 Redis GUI 管理工具,它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控,并且可以在界面上使用 CLI 和连接的 Redis 进行交互(RedisInsight 内置对 Redis 模块支持&#…...
Matlab定义函数计算斐波那契数列
以下是使用 MATLAB 定义函数计算并输出斐波那契数列前 200 个数的示例代码: function result fibonacci(n)if n < 1 || n > 200result NaN;elseif n 1 || n 2result 1;elseresult fibonacci(n-1) fibonacci(n-2);end endn 200; result fibonacci(n)…...
计算机网络面试题总结
总结自Network | JavaGuide(Java面试 学习指南) 什么是OSI7层模型? 什么是TCP/IP 四层模型? 为什么网络要分层? 应用层有哪些常见的协议? 传输层有哪些常见的协议? 网络层有哪些常见的协议? 从输入…...
视频转为序列图的软件,让视频批量转为序列图
你是否曾经遇到过这样的困境:需要将一段视频转为一系列的图片,但却没有合适的工具来完成?或许你曾经手动截图,或者用其他方式,但结果往往不尽如人意,图片质量差、色彩失真、画面不清晰。现在,让…...
目标检测中的常见指标
概念引入: TP:True Positive IoU > 阈值 检测框数量 FP: False Positive IoU < 阈值 检测框数量 FN: False Negative 漏检框数量 Precision:查准率 Recall:查全率(召回率) AP&am…...
QT上位机开发(会员充值软件)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 所有的控件当中,除了label、edit、radio、combobox和button之外,另外一个用的比较多的控件就是grid,也可称之为…...
小程序实现绘制图片 保存到手机
HTML <template><view><canvas canvas-id"myCanvas" :style"{height:380px,width:wWidthpx,background:#FFFFFF}"></canvas><view class"textCenter"><button click"saveCanvas">保存图片</b…...
Elasticsearch基本操作之索引操作
本文说下Elasticsearch基本操作之索引操作 文章目录 概述创建索引创建索引示例重复创建索引示例 查看索引查看所有索引查看单个索引 删除索引删除索引 概述 由于是使用命令来操作Elasticsearch,可以使用kibana,postman和apifox等工具 我使用了apifox来执…...
调用Java线程相关的API为什么能够控制操作系统线程?
今天我们解决Java线程的这五个问题: Java线程创建的完整流程 Java的线程是何时与JVM线程绑定的 JVM线程是何时与OS线程绑定的 Java线程对应的OS线程有什么特殊的地方 调用JavaAPI为什么能够操作OS线程 对于任何支持多线程的计算机语言来说,深入理解…...
【办公技巧】excel中设置选项按钮的方法
大家是否会遇到需要勾中选项的情况,我们可以在电子表格中制作出可以勾选、选中的选项按钮,今天我们一起学习一下设置方法。 首先,我们需要先在excel工具栏中添加一个功能模块:开发工具 依次点击excel中的文件 – 选项 – 自定义…...
如何编写高效的正则表达式?
正则表达式(Regular Expression,简称regex)是一种强大的文本处理技术,广泛应用于各种编程语言和工具中。本文将从多个方面介绍正则表达式的原理、应用和实践,帮助你掌握这一关键技术。 正则可视化 | 一个覆盖广泛主题…...
vue3中使用pinia,更改state中数据,试图不更新问题
直接上代码 使用computed,可以实现。...
【前端设计】文字聚光灯
欢迎来到前端设计专栏,本专栏收藏了一些好看且实用的前端作品,使用简单的html、css语法打造创意有趣的作品,为网站加入更多高级创意的元素。 案例 文字聚光灯效果可以用于网站标题 html <!DOCTYPE html> <html lang"en&quo…...
从零开始搭建企业级前端项目模板(vue3+vite+ts)
文章目录 主要内容一、vite脚手架工具初始化项目二、项目代码加入eslint校验和自动格式化2.1安装对应依赖插件2.2 配置script脚本,项目安装eslint配置2.3 安装完成后,后面启动项目还缺少一些依赖,提前按需安装好 三,修改eslintrc.…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
