图像分割-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

)

参数说明:

  1. img:输入输出的图像,必须是三通道彩色图像。
  2. mask:指定的掩码图像,必须是单通道灰度图像,并且与输入图像具有相同的尺寸。可以传入0-3的值,分别为:0表示明显为背景的像素、1表示冥相位前景的像素、2表示可能为背景的像素、3表示可能为前景的像素。
  3. rect:指定的矩形框,用于定位大概率可能为前景目标的位置。
  4. bgdModel:背景模型,必须是单通道浮点型Mat。
  5. fgdModel:前景模型,必须是单通道浮点型Mat。
  6. iterCount:迭代次数,用于控制算法的收敛性。
  7. 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 教程 目录

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

客服系统接入FastGPT

接入FastGPT 点击【应用】【外部使用】【API访问】【新建】新建一个KEY,同时也可以看到我们的API根地址 这个根地址和Key可以填入任何支持OpenAI接口的应用里,这个接口是兼容OpenAI格式。 在客服系统【知识库AI配置】里填上接口地址和接口密钥。这样我…

MATLAB指令

01--根据数学公式进行绘制 1.绘制连续函数 ①一元函数 t0:0.1:10; y3*t2; plot(t,y) ②一元二次函数 t0:0.1:10; yt.*t; plot(t,y) 注意此处应为点乘 ③一元3次 t0:0.1:10; yt.*t.*t; plot(t,y) ④y1/t t0:0.1:10; y1./t; plot(t,y) ⑤yexp(t) t0:0.1:10; yexp(2*t); p…

Java如何拷贝数据?

Java如何拷贝数据? 在 Java 中,数组和集合的深拷贝与浅拷贝的概念与复制对象的引用和内容相关。深拷贝是创建一个新对象,并递归地复制其所有内容,而浅拷贝则只是复制对象的引用。 数组的深拷贝与浅拷贝: 1. 深拷贝数…

大模型第三节课程笔记

大模型开发范式 优点:具有强大语言理解,指令跟随,和语言生成的能力,具有强大的知识储备和一定的逻辑推理能力,进而能作为基座模型,支持多元应用。 不足:大模型的知识时效性受限,大模…

每日算法打卡:数的三次方根 day 7

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例:输出样例: 题目分析示例代码 原题链接 790. 数的三次方根 题目难度:简单 题目描述 给定一个浮点数 n,求它的三次方根。 输入格式 共一行,包含一个浮…

matlab使用PhysioNet的WFDB工具箱

目录 PhysioNet 官方安装示例 PhysioNet 官方 官方的文档:Waveform Database Software Package (WFDB) for MATLAB and Octave 简介:用于MATLAB的WFDB工具箱是用于读取、写入和操作(处理)PhysioNet数据的MATLAB函数的集合&#x…

SpringBoot—支付—支付宝

一、流程 二、沙箱操作 1.用支付宝账号登录【开放控制平台】创建应用获取 appid 2.选择沙箱模拟环境 3.沙箱应用-》获取appid(一个appid绑定一个收款支付宝账户) 4.利用开发助手工具生成RSA2密钥 公钥:传给支付宝平台 私钥:配置代码中,…

ShardingSphere-JDBC学习笔记

引言 开源产品的小故事 Sharding-JDBC是2015年开源的,早期的定位就是一个分布式数据库的中间件,而在它之前有一个MyCat的产品。MyCat也是从阿里开源出来的,作为分库分表的代名词火了很长一段时间,而MyCat早年的目标就是想进入ap…

小白入门基础 - tomcat

一:前言 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为&#x…

分布式【zookeeper面试题23连问】

1. ZooKeeper是什么? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#x…

Spring Boot 完善订单【五】集成接入支付宝沙箱支付

1.1.什么是沙箱支付 支付宝沙箱支付(Alipay Sandbox Payment)是支付宝提供的一个模拟支付环境,用于开发和测试支付宝支付功能的开发者工具。在真实的支付宝环境中进行支付开发和测试可能涉及真实资金和真实用户账户,而沙箱环境则提…

【C++】STL 算法 ⑥ ( 二元谓词 | std::sort 算法简介 | 为 std::sort 算法设置 二元谓词 排序规则 )

文章目录 一、二元谓词1、二元谓词简介2、 std::sort 算法简介3、 代码示例 - 为 std::sort 算法设置 二元谓词 排序规则 一、二元谓词 1、二元谓词简介 " 谓词 ( Predicate ) " 是一个 返回 布尔 bool 类型值 的 函数对象 / 仿函数 或 Lambda 表达式 / 普通函数 , …

安全数据交换系统:有效提升网间文件交换能力

各级政府部门和金融、能源、电力这些行业,以及一些大中型企业组织,为了保护内部的重要数据不外泄,普遍都采用了多网络并行的方式,也是做了网络隔离划分,不同的网络拥有不同的密级以及人员权限。然后再通过安全数据交换…

java中使用redis

1、redis数据类型 1.1、5种数据类型 redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:字符串 string、哈希 hash、列表 list、集合 set、有序集合 sorted set / zset。 字符串(string):普通字符…

Day1Qt

1、实现登录窗口界面 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QIcon>//图标 #include <QLabel>//标签类 #include <QMovie>//动态类 #include <QLineEdit>//行编辑类 #include <QPushButton>…

promethues grafana 安装和使用

文章目录 1、promethues安装2、node-exporter安装3、grafana安装4、配置promethues监控node节点5、grafana操作外传 Docker 镜像下载地址&#xff1a; https://hub.docker.com 比较好的hub.docker.com///-- https://hub.docker.com/u/bitnami grafana监控面板&#xff1a;https…

电子学会C/C++编程等级考试2023年12月(三级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:因子问题 任给两个正整数N、M,求一个最小的正整数a,使得a和(M-a)都是N的因子。 时间限制:10000 内存限制:65536 输入 包括两个整数N、M。N不超过1,000,000。 输出 输出一个整数a,表示结果。如果某个案例中满足条件的正整数不存…

使用Python+selenium3.0实现第一个自动化测试脚本

这篇文章主要介绍了使用Pythonselenium实现第一个自动化测试脚本&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 最近在学web自动化&#xff0c;记录一下学习过程。…

【算法与数据结构】70、LeetCode爬楼梯

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;   程序如下&#xff1a; 复杂度分析&#xff1a; 时间复杂度&#xff1a; O ( ) O() O()。空间复…

【React系列】高阶组件

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 高阶组件 1.1. 认识高阶组件 什么是高阶组件呢&#xff1f;相信很多同学都听说过&#xff0c;也用过 高阶函数&…