图像分割-Grabcut法

2024-01-04

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

本文的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 教程 目录

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像分割-Grabcut法 的相关文章

  • Mysql 常用命令

    史上最全MySQL基本操作 这一篇就够用了 mysql操作 CSDN博客 查看 mysql 运行状态 systemctl status mysql 查看 mysql 服务器正在使用的端口号 SHOW GLOBAL VARIABLES LIK

随机推荐

  • 财务管理软件自定义表格行数、记录时间、收支类别,智能导出账目明细的记账软件推荐

    在数字化时代 个人财务管理变得越来越重要 晨曦记账本软件作为一款强大的记账工具 以其丰富的自定义功能和便捷的操作 成为了许多人的首选 无论您是要记录日常开支 管理家庭账本 还是追踪生意账目 晨曦记账本都能为您提供完美的解决方案 1 在软件的
  • 一体化监控方案:机房动环、门禁系统与安全监控

    一 引言 随着信息技术的快速发展和安全意识的不断提高 机房动环监控 门禁系统监控与安全监控对于企业数据安全和运营至关重要 为了提高机房管理水平 确保设备安全稳定运行 降低潜在风险 我们提出了一体化监控方案 整合机房动环监控 门禁系统监控和安
  • Bean如何诞生与消亡:生命周期探秘【beans 二】

    欢迎来到我的博客 代码的世界里 每一行都是一个故事 Bean如何诞生与消亡 生命周期探秘 beans 二 前言 bean的创建过程 bean的初始化阶段 1 实现InitializingBean接口 2
  • 初学者之友:一套经济实惠且易于上手的电脑配置方案

    一 引言 对于初学者来说 选择一台合适的电脑可能是一项艰巨的任务 他们可能不熟悉各种硬件规格和技术术语 容易被市场上众多的选择所迷惑 为了帮助初学者解决这个问题 本文将介绍一套经济实惠且易于上手的电脑配置方案 二 核心硬件 处理器与内存 处
  • 软件测试开发/全日制丨Web端测试—JavaScript讲解 学习笔记

    本文转自测试人社区 霍格沃兹测试开发学社学员笔记 原文链接 https ceshiren com t topic 29440 一 简介 JavaScript 是脚本语言 一种轻量级的编程语言 是可插入 HTML 页面的编程代码 插入 HTM
  • @Service Spring required a bean could not be found.

    Description Field inservice in controller required a bean of type Inservice that could not be found The injection point
  • Python内置类属性__module__属性的使用教程

    概要 在Python中 每个对象都有一些内置的属性 这些属性提供了有关对象的一些信息 其中一个内置属性是 module 属性 module 属性是一个字符串 它表示定义了类或函数的模块的名称 在本篇文章中 我们将详细介绍 module 属性
  • 运维的本质是什么?阿里“无人化”智能运维平台的演进

    差不多在两年前 阿里内部出现了很多运维中台 研发中台等等 那有没有后台呢 不好意思 我们只有中台 没有后台 会在中台上构建与业务相关的各个前台 目前阿里的业务几乎覆盖了所有行业 有着很多业务线 如果业务线的前台到中台全部都是我们自己去建设
  • 系统有万亿条消息怎么存储?

    系统有万亿条消息怎么存储 本文转自 公众号 ByteByteGo 如有侵权 请联系 立即删除 我们如何设计一个能存储数万亿条信息的系统 Discord 的消息存储演进给我们提供了真实案例参考 下图显示了 Discord 消息存储的演变过程
  • 学了网安有机会自己当老板——初创网络安全公司的指南

    初创公司的创始人常常会误以为黑客不会在他们创业的公司身上浪费时间 因为他们还不够大 不够有名 没有什么价值 你的规模小 知名度小并不意味着你不会成为攻击者的目标 初创公司的规模并不能使其免于网络攻击 因为黑客们会不断扫描互联网 寻找他们可以
  • C语言——!(--x)和!(-x)以及while(!(--x)) 和 while(!(-x))

    一 x 和 x 1 x 这个表达式表示先对变量 x 执行自减操作 即 x 的值减去 1 然后对自减后得到的结果取逻辑非 如果自减后的 x 等于 0 则逻辑非运算的结果为真 值为 1 否则结果为假 值为 0 2 x 这个表达式表示对 x 取反
  • Python 操作 JMeter 探索:pymeter 实操指南

    概要 JMeter 是一个流行的性能测试工具 用于测试 Web 应用程序的性能和负载 它通常与 GUI 一起使用 但如果您想在自动化测试中集成 JMeter 或者以编程方式创建和运行测试计划 那么 pymeter 库将是一个强大的工具 本文
  • HOOPS助力AVEVA数字化转型:支持多种3D模型格式转换!

    行业 电力和公用事业 化工 造船 能源 采矿业 挑战 创建大规模复杂资产的客户需要汇集多种类型的数据 以支持初始设计和创建强大的数字双胞胎 现有版本的产品只支持半打CAD格式 有限的内部开发资源限制了增加对新格式支持的能力 解决方案 HOO
  • 成为一名合格的软件测试工程师,得掌握什么技能?

    在这个信息时代 软件行业的需求空前增长 而 软件测试 工程师作为 软件开发 过程中的重要角色 也越来越受企业的重视 那么 成为一名合格的软件测试工程师需要掌握什么技能呢 我结合多年的教学经验为大家总结出以下几点 1 掌握基础理论 要想楼层盖
  • Web前端安全学习-CSRF

    今天下午上了一堂前端安全的课 挺有意思 记录下来 在上课之前 我对安全的概念是 用户输入是不可信的 所有用户的输入都必须转义之后才入库 然后 上面这个这种方式 仅仅是防止SQL注入攻击 避免业务数据库被渗入 在数据库有了一层安全保护之后 攻
  • 门禁管理:我才知道这个技术,可以如此高效!

    随着社会的发展和科技的进步 门禁监控技术在各类场所得到了广泛的应用 门禁监控系统不仅仅是简单的出入口管理 更是对安全和隐私的重要保障 客户案例 企业办公大楼 在现代企业办公环境中 对于办公大楼的安全管理显得尤为重要 通过部署泛地缘科技推出的
  • 挑选知识付费平台不再迷茫:掌握这些技巧,轻松找到适合自己的平台

    明理信息科技知识付费saas租户平台 在当今的知识付费市场中 用户面临的选择越来越多 如何从众多知识付费平台中正确选择属于自己的平台呢 下面 我们将为您介绍明理信息科技知识付费平台相比同行的优势 帮助您做出明智的选择 一 创新的技术架构 高
  • 8大数字技术打造ESG发展新范式!工业“双碳”建设应该这么做

    随着国家 双碳 目标的提出 数字化 绿色化证进入历史交汇 协同发展 路径合一 相辅相成的重要阶段 在此背景下 中国信通院 中国航天航空 工业互联网产业联盟于2022年联合出版了 数字技术赋能工业碳达峰碳中和应用指南 以下简称 指南 今年又细
  • 高德地图API

    首先注册高德地图API账户成为开发者用户 然后申请key与密钥 应用管理 我的应用 创建新应用 加载高德地图
  • 图像分割-Grabcut法

    版权声明 本文为博主原创文章 转载请在显著位置标明本文出处以及作者网名 未经作者允许不得用于商业目的 本文的C 版本请访问 图像分割 Grabcut法 C CSDN博客 GrabCut是一种基于图像分割的技术 它可以用于将图像中的前景和背景