图像分割-Grabcut法

news2025/1/16 16:38:14

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

本文的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.Click
        Dim m As New Mat("C:\learnEmgucv\tower.jpg", ImreadModes.AnyColor)

        Dim result As New Mat
        Dim bg As New Mat
        Dim fg As New Mat

        Dim 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 - 1
            For j As Integer = 0 To matr.Rows - 1
                '将确定背景和可能背景标记为0,否则为255
                If matr(j, i) = 0 Or matr(j, i) = 2 Then
                    matr(j, i) = 0
                Else
                    matr(j, i) = 255
                End If
            Next
        Next
        Dim midm As New Mat
        midm = matr.Mat
        '显示标记的图像
        CvInvoke.Imshow("midm", midm)

        '灰度转为彩色
        Dim midm1 As New Mat
        CvInvoke.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.Click
        Dim m As Mat = CvInvoke.Imread("C:\learnEmgucv\tower.jpg", CvEnum.ImreadModes.Color)

        Dim result As New Mat
        Dim bg As New Mat
        Dim fg As New Mat

        Dim 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 - 1
            For j As Integer = 0 To src.Cols - 1
                '如果是确定前景和可能前景,直接保留原像素点颜色,否则为黑色
                If mask.Data(i, j, 0) = 1 Or mask.Data(i, j, 0) = 3 Then
                    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
                End If

            Next
        Next
        ImageBox1.Image = dst
End Sub

输出结果如下图所示:

图8-6 Grabcut法分离前景

   '标记为确定前景,这里使用InitWithMask 参数
    Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
        Dim m As New Mat("c:\learnEmgucv\lena.jpg", ImreadModes.AnyColor)

        Dim mask As New Mat
        Dim bg As New Mat
        Dim fg As New Mat
        Dim 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 - 1
            For j As Integer = 0 To matrx.Rows - 1
                If matrx(i, j) = 0 Or matrx(i, j) = 2 Then
                    matrx(i, j) = 0
                Else
                    matrx(i, j) = 255
                End If
            Next
        Next
        Dim midm2 As New Mat
        midm2 = matrx.Mat

        Dim midm1 As New Mat
        CvInvoke.CvtColor(midm2, midm1, ColorConversion.Gray2Bgr)

        Dim mout As New Mat
        CvInvoke.BitwiseAnd(m, midm1, mout)
        CvInvoke.Imshow("mout", mout)
End Sub

输出结果如下图所示:

图8-7 Grabcut法分离前景

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

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

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

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

相关文章

vue中key的用法

加key是提升vue渲染效率,减少DOM操作。 vue列表元素的更新机制: 当列表元素没有设置key的时候,vue判断是否操作这个DOM元素,是根据新旧两次数据的元素顺序进行对比,看一下元素内容是否发生变化。发生变化vue就操作这个…

关于Python里xlwings库对Excel表格的操作(二十八)

这篇小笔记主要记录如何【如何使用“Chart类”和“Api类"为新图表设置标题文本内容、字体、字号、粗细、正斜、颜色】。 前面的小笔记已整理成目录,可点链接去目录寻找所需更方便。【目录部分内容如下】【点击此处可进入目录】 (1)如何…

大数据Doris(四十六):物化视图查询改写和适用场景

文章目录 物化视图查询改写和适用场景 一、查询改写

移动神器RAX3000M路由器不刷固件变身家庭云之六(高级应用):设置https

本系列文章: 移动神器RAX3000M路由器变身家庭云之一:开通SSH,安装新软件包 移动神器RAX3000M路由器变身家庭云之二:安装vsftpd 移动神器RAX3000M路由器变身家庭云之三:外网访问家庭云 移动神器RAX3000M路由器变身家庭云…

c# 学习笔记 - 枚举

文章目录 1. 枚举1.1 枚举结构梳理1.2 枚举完整代码1.3 枚举知识点补充 2. 迭代两种命名空间接口3. yield语句 1. 枚举 1.1 枚举结构梳理 结构图   上图内容可能依旧不通俗易懂,这里使用最简明的话语告诉大家实现方式. foreach语句就是集合的遍历操作&#xff0c…

彻底弄懂MySQL事务隔离级别

并发事务中存在以下 3 个问题。 1 脏读 指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会保存到数据库,也可能会回滚,不保存到数据库。当这个数据发生了回滚,就意味着读到的这个数据不存在,这就是脏读! 2 不可重复读 在同一个事务中,同一个查询在不同的…

Spring Cloud Alibaba 介绍与版本映射关系

目录 前言 一、Spring Cloud Alibaba 是什么? 二、Spring Cloud Alibaba 版本依赖 前言 Spring Cloud 本身并不是一个拿来即可用的框架,它是一套微服务规范,这套规范共有两代实现。 (子项目): ● 第一代实现: Spr…

yolov5旋转目标检测-遥感图像检测-无人机旋转目标检测(附代码和原理)

目前,无人机技术的快速发展带来了遥感图像处理领域的革命性改变。然而,由于无人机在飞行时可能会出现旋转的情况,因此对于旋转目标的检测也成为了一个重要的问题。针对这个问题,yolov5可以提供一种高效的解决方案。 以下是介绍的分…

SSCI及SCI撰写|查找文献doi的八大方法

一、前言 (一)文献DOI概念介绍 DOI(Digital Object Identifier)是一种用于标识数字对象的持久性标识符系统。在学术出版领域,DOI通常用于标识和定位学术文献,包括期刊文章、会议论文、报告等。以下是 DOI 的一些重要特点和介绍&a…

法二(命令行):YOLOv5打包.exe

0 准备工作 yolov5环境配置完毕安装pyinstaller,命令为 pip install pyinstallerps: 为了避免可能的错误,所有操作请在英文路径下进行。 1 修改detect_qt5.py或者相关文件 如果是使用我的检测界面的,应该是修改detect_qt5.py这个文件&#x…

HTTP和TCP代理原理及实现,主要是理解

Web 代理是一种存在于网络中间的实体,提供各式各样的功能。现代网络系统中,Web 代理无处不在。我之前有关 HTTP 的博文中,多次提到了代理对 HTTP 请求及响应的影响。今天这篇文章,我打算谈谈 HTTP 代理本身的一些原理,…

springboot中引入AOP切面编程

在Spring Boot 3.0中引入AOP的过程如下所示&#xff1a; 1、首先&#xff0c;确保已经添加了相关依赖。可以通过Maven或Gradle来管理项目的依赖。对于使用Maven构建的项目&#xff0c;需要将以下依赖添加到pom.xml文件中 <dependency><groupId>org.springframewo…

Optional 优雅判空

文章目录 可以解决的问题API介绍Optional(T value),empty(),of(T value),ofNullable(T value)orElse(T other)&#xff0c;orElseGet(Supplier<? extends T> other)和orElseThrow(Supplier<? extends X> exceptionSupplier)map(Function<? super T, ? exten…

Linux第8步_USB设置

学习完设置“虚拟机的电源”后&#xff0c;接着学习通过鼠标点击操作U盘&#xff0c;目的是了解USB设置。 1、在桌面&#xff0c;双击“VMware Workstation Pro”图标&#xff0c;得到下图&#xff1a; 2、点击“编辑虚拟机”&#xff0c;得到下图&#xff1a; 只要点击编辑虚…

03 decision tree(决策树)

一、decision tree&#xff08;决策树&#xff09; 1. classification problems&#xff08;纯度&#xff09; i . entropy &#xff08;熵&#xff09; ​ 作用&#xff1a;衡量一组数据的纯度是否很纯 &#xff0c;当五五开时他的熵都是最高的&#xff0c;当全是或者都不是…

【数据结构】——期末复习题库(6)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

【bug】【VSCode】远程终端TERMINAL打不开

【bug】【VSCode】远程终端TERMINAL打不开 可能的原因现象分析解决 可能的原因 昨天晚上vscode在打开多个TERMINAL的情况下&#xff0c;挂了一晚上&#xff0c;今早上来看的时候全都lost connections…。然后关闭再打开就出现了如上现象。 早上一来到实验室就要debug… 现象…

金蝶Apusic应用服务器 loadTree JNDI注入漏洞

产品介绍 金蝶Apusic是一款企业级应用服务器&#xff0c;支持Java EE技术&#xff0c;适用于各种商业环境。 漏洞概述 由于金蝶Apusic应用服务器权限验证不当&#xff0c;使用较低JDK版本&#xff0c;导致攻击者可以向loadTree接口执行JNDI注入&#xff0c;远程加载恶意类&a…

计算机Java项目|Springboot+vue 学生心理咨询评估系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

Linux内存管理:(五)反向映射RMAP

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 前置知识&#xff1a;page数据结…