图像分割-Grabcut法(C#)

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

本文的VB版本请访问:图像分割-Grabcut法-CSDN博客

GrabCut是一种基于图像分割的技术,它可以用于将图像中的前景和背景分离。在实现中,GrabCut算法通常需要使用高斯混合模型(GMM)来建立前景和背景的概率分布,以便更好的估计像素的标签。同时,还需要考虑如何处理边界处的像素,以避免边界处的像素被错误地分类。GrabCut算法在图像分割中有着广泛的应用,例如人像分割、物体抠图等。

EmguCV使用CvInvoke.GrabCut方法来执行GrabCut算法,该方法声明如下:

public static void GrabCut(

           IInputArray img,

                    IInputOutputArray mask,

                    Rectangle rect,

                    IInputOutputArray bgdModel,

                    IInputOutputArray fgdModel,

                    int iterCount,

                   GrabcutInitType type

)

参数说明:

  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 void Button5_Click(object sender, EventArgs e){Mat m = new Mat("C:\\learnEmgucv\\tower.jpg", ImreadModes.AnyColor);Mat result = new Mat();Mat bg = new Mat();Mat fg = new Mat();Rectangle rect = 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;//标记区域Matrix<byte> matr = new Matrix<byte>(result.Rows, result.Cols);result.CopyTo(matr);for (int i = 0; i < matr.Cols; i++){for (int j = 0; j < matr.Rows; j++){//将确定背景和可能背景标记为0,否则为255if (matr[j, i] == 0 || matr[j, i] == 2)matr[j, i] = 0;elsematr[j, i] = 255;}}Mat midm = new Mat();midm = matr.Mat;//显示标记的图像CvInvoke.Imshow("midm", midm);//灰度转为彩色Mat midm1 = new Mat();CvInvoke.CvtColor(midm, midm1, ColorConversion.Gray2Bgr);Mat mout = new Mat();//And运算CvInvoke.BitwiseAnd(m, midm1, mout);CvInvoke.Imshow("mout", mout);}

输出结果如下图所示:

图8-5 Grabcut法分离前景

       //Grabcut法 private void Button6_Click(object sender, EventArgs e){Mat m = CvInvoke.Imread("C:\\learnEmgucv\\tower.jpg", ImreadModes.Color);Mat result = new Mat();Mat bg = new Mat();Mat fg = new Mat();Rectangle rect = new Rectangle(80, 30, 680, 450);CvInvoke.GrabCut(m, result, rect, bg, fg, 5, GrabcutInitType.InitWithRect);Image<Bgr, byte> src = m.ToImage<Bgr, byte>();Image<Bgr, byte> dst = new Image<Bgr, byte>(new Size(src.Width, src.Height));Image<Gray, byte> mask = result.ToImage<Gray, byte>();//直接操作Image像素点for (int i = 0; i < src.Rows; i++){for (int j = 0; j < src.Cols; j++){//如果是确定前景和可能前景,直接保留原像素点颜色,否则为黑色if (mask.Data[i, j, 0] == 1 || mask.Data[i, j, 0] == 3){dst.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];}else{dst.Data[i, j, 0] = 0;dst.Data[i, j, 1] = 0;dst.Data[i, j, 2] = 0;}}}ImageBox1.Image = dst;}

输出结果如下图所示:

图8-6 Grabcut法分离前景

      //标记为确定前景,这里使用InitWithMask 参数private void Button7_Click(object sender, EventArgs e){Mat m = new Mat("c:\\learnEmgucv\\lena.jpg", ImreadModes.AnyColor);Mat mask = new Mat();Mat bg = new Mat();Mat fg = new Mat();Rectangle rect = new Rectangle(80, 30, 340, 480);//使用前景为全白色Mat m1 = new Mat("c:\\learnEmgucv\\lena_fillwhite.jpg", ImreadModes.Grayscale);Mat mask1 = 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);Matrix<byte> matrx = new Matrix<byte>(mask1.Rows, mask1.Cols);mask1.CopyTo(matrx);for (int i = 0; i < matrx.Cols; i++)for (int j = 0; j < matrx.Rows; j++)if (matrx[i, j] == 0 || matrx[i, j] == 2)matrx[i, j] = 0;elsematrx[i, j] = 255;Mat midm2 = new Mat();midm2 = matrx.Mat;Mat midm1 = new Mat();CvInvoke.CvtColor(midm2, midm1, ColorConversion.Gray2Bgr);Mat mout = new Mat();CvInvoke.BitwiseAnd(m, midm1, mout);CvInvoke.Imshow("mout", mout);}

输出结果如下图所示:

图8-7 Grabcut法分离前景

由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。

学习更多vb.net知识,请参看vb.net 教程 目录

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

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

相关文章

Linux第15步_安装FTP客户端

安装完FTP服务器后&#xff0c;还需要安装FTP客户端&#xff0c;才可以实现Ubuntu系统和Windows系统进行文件互传。 1、在STM32MP157开发板A盘基础资料\03软件中&#xff0c;找到“FileZilla_3.51.0_win64-setup.exe”&#xff0c;双击它&#xff0c;就可以安装。 2、点击“I …

Fontfabric:一款字体与设计的完美结合

一、产品介绍 Fontfabric是一款由国际字体设计公司Fontfabric开发的字体设计软件。它提供了一整套完整的字体设计工具&#xff0c;让用户可以轻松地创建、设计和定制自己的字体。Fontfabric拥有丰富的字体库&#xff0c;包括各种风格和类型&#xff0c;能够满足用户在不同场景…

安全加密基础—基本概念、keytool、openssl

安全加密基础—基本概念、keytool、openssl 目录 前言 一、概念 明文通信 无密钥密文通信 对称加密 非对称加密 数字签名 消息摘要(MD5) CA数字证书(解决公钥分发的问题) HTTPS 相关文件扩展名 常用后缀名 普通的pem文件内容 二、keytool 2.1常用的命令如下 2…

docker 完成MySQL的主从复制

文章目录 搭建步骤 搭建步骤 拉取镜像 docker pull mysql:5.7运行主从 docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_P…

外包干了1个月,技术退步一大半。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

c语言版:数据结构(时间复杂度,空间复杂度,练习)

时间复杂度 概念 时间复杂度是用来衡量算法执行时间的一个指标。它表示随着输入规模的增加&#xff0c;算法执行时间的增长率。时间复杂度通常用大O符号表示。 在计算时间复杂度时&#xff0c;通常会忽略常数项、低阶项和系数项&#xff0c;只关注随着输入规模增长而导致的主要…

网络名称解读 -入门5

WAN: Wide Area Network(跨区域&#xff09;&#xff0c;LAN&#xff1a; Local Area NetworkWAN MAC&#xff0c; 用来连接上级网络&#xff0c; LAN MAC&#xff0c; 用于内部网路。 LAN & WAN 3.1&#xff0c;LAN表示子网&#xff0c;通过掩码来筛选子网内主机数量&…

【C++】类和对象详解(类的使用,this指针)

文章目录 前言面向过程和面向对象的初步认识类的引入类的定义类的访问限定符和封装性访问限定符封装性 类的作用域类的实例化类对象模型如何计算类对象的大小类对象的存储方式猜测结构体内存对齐规则 this指针this指针的引出this指针的特性 总结 前言 提示&#xff1a;这里可以…

计算机毕业设计选题分享-SSM律师事务所业务管理系统01664(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

SSM律师事务所业务管理系统 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;律师事务所业务管理系统当然也不能排除在外。律师事务所业务管理系统是以实际运用为开发背景…

静态网页设计——电影推荐网(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1NK411x7oK/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

【亚马逊云科技】使用Helm 3为Amazon EKS部署Prometheus+Grafana监控平台

文章目录 1. 创建Kubernetes命名空间2. 添加Prometheus社区helm chart3. 安装prometheus4. 检查Prometheus Pod运行状况5. 检查Prometheus Service部署情况6. 修改服务访问端口类型7. 访问Prometheus数据收集情况8. 访问Grafana9. 设置数据源10. 查看Kubernetes各类性能可视化参…

c/c++运算符优先级【一文搞懂】【大白讲解】

C运算符优先级教程 我们知道&#xff0c;在数学运算中&#xff0c;有 “先乘除后加减” 的运算规则&#xff0c;在我们程序语言中一样有运算符的优先级问题&#xff0c;来决定我们运算的顺序问题&#xff0c;这就是运算符的优先级。 即所谓运算符的优先级&#xff0c;指的是在…

【linux笔记】top、ps

【linux笔记】top命令 top&#xff08;Table of process&#xff09;是动态变化的。而ps是静态的。 PID — 进程id USER — 进程所有者 PR — 进程优先级 NI — nice值。负值表示高优先级&#xff0c;正值表示低优先级 VIRT — 进程使用的虚拟内存总量&#xff0c;单位kb。VI…

C语言实例_string.h库函数功能及其用法详解

一、前言 在计算机编程中&#xff0c;字符串处理是一项常见而重要的任务。C语言的string.h头文件提供了一系列函数和工具&#xff0c;用于对字符串进行操作和处理。这些函数包括字符串复制、连接、比较、查找等功能&#xff0c;为开发人员提供了强大的字符串处理能力。本文将对…

计算机中的数据运算

放上计算机中的数据的表示方法 计算机中的数据表示方法-CSDN博客 补码的运算&#xff1a; 连同符号位一起相加&#xff0c;符号位产生的进位自然丢掉&#xff0c;这里要特别注意机器数的位数&#xff0c;计算数的位数决定了可以存放的数据的大小&#xff0c;加减产生的数据的…

ATTCK视角下的信息收集:主机发现

目录 1、利用协议主动探测主机存活 利用ICMP发现主机 利用ARP发现主机 利用NetBIOS协议发现主机 利用TCP/UDP发现主机 利用DNS协议发现主机 利用PRC协议发现主机程序 2、被动主机存活检测 利用Browser主机探测存活主机 利用ip段探测主机存活 利用net命令探测主机存活…

【软件测试】学习笔记-测试覆盖率

测试覆盖率通常被用来衡量测试的充分性和完整性&#xff0c;从广义的角度来讲&#xff0c;测试覆盖率主要分为两大类&#xff0c;一类是面向项目的需求覆盖率&#xff0c;另一类是更偏向技术的代码覆盖率。 需求覆盖率 需求覆盖率是指测试对需求的覆盖程度&#xff0c;通常的做…

UAV | 多算法在多场景下的无人机路径规划(Matlab)

近年来&#xff0c;无人机(unmanned aerial vehicle&#xff0c;UAV)由于其灵活度高、机动性强、安全风险系数小、成本低等特点&#xff0c;被广泛应用于搜索巡逻、侦察监视、抢险救灾、物流配送、电力巡检、农业灌溉等军用或民用任务。路径规划是无人机执行任务的关键&#xf…

第34期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

数据结构之绪论

一个著名公式&#xff1a; 程序数据结构算法 非数值计算&#xff1a;无法用数学的公式或方程来描述 描述非数值计算问题的数据模型不是数学方程&#xff0c;而是诸如表&#xff0c;树和图之类的具有逻辑关系的数据 数据结构&#xff1a;是一门研究非数值计算的程序设计中计算机…