图像分割-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.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 教程 目录

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CnosDB容灾方案概述

本文主要介绍了跟容灾相关的关键技术以及技术整合后形成的几种具体方案,每种方案都在RTO、RPO、部署成本和维护成本等方面有自己的特点和区别,可以根据具体场景选择最合适的方案。 基本概念 RTO(Recovery Time Objective)&#x…

Qt基本认识

1. 基本认识 1.1 学习方法: (1)英语阅读能力要好一点 QT将一些类和方法进行了封装,一般是采用英语(方法名、属性、子类、父类等等)进行介绍 (2)学习QT reator 1)多查帮助…

数据交互系列:认识 cookie

cookie的原理 http本身是一个无状态的请求,cookie最初的原始目的是为了维持状态而产生的。在首次访问网站时,浏览发送请求中并未携带cookie,即发送无状态请求服务器接受请求之后会在请求上的respond header上加入cookie相关信息并返回给浏览…

数字孪生在虚拟现实(VR)中的应用

数字孪生在虚拟现实(VR)中的应用为用户提供了更深入、沉浸式的体验,同时通过数字孪生技术模拟真实世界的物理实体。以下是数字孪生在VR中的一些应用,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发…

13年测试老鸟,性能测试-全链路压测总结,一文打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、什么是全链路压…

二维和三维联合进行圆孔空间定位

0.任务描述 对空间圆孔进行三维空间的定位,方便后续的抓取或装配流程:使用二维图与opencv霍夫圆检测进行二维上的定位,再从深度图上查询深度信息,结合相机内参计算出相机坐标系下圆孔的三维坐标信息,并在点云上进行标…

自定义View之重写onMeasure

一、重写onMeasure()来修改已有的View的尺寸 步骤: 重写 onMeasure(),并调用 super.onMeasure() 触发原先的测量用 getMeasuredWidth() 和 getMeasuredHeight() 取到之前测得的尺寸,利用这两个尺寸来计算出最终尺寸使用 setMeasuredDimensio…

[通俗易懂]c语言中指针变量和数值之间的关系

一、指针变量的定义 在C语言中,指针变量是一种特殊类型的变量,它存储的是另一个变量的内存地址。指针变量可以用来间接访问和操作内存中的其他变量。指针变量的定义如下: 数据类型 *指针变量名;其中,数据类型可以是任…

SQL优化:执行计划

前面我们讲述了使用索引或分区表来进行存储层次的优化,也讲述了通过条件提升进行结果集的优化。这边文章我们来学习一下其中的细节,即查看数据库是怎么一步一步把数据拿给我们的。也就是执行计划。 语法 explain sql语句 练习 首先,我们来玩下简单的 explain select * …

HUAWEI WATCH 系列 eSIM 全新开通指南来了

HUAWEI WATCH 系列手表提供了eSIM硬件能力,致力为用户提供更便捷、高效的通信体验。但eSIM 业务是由运营商管理并提供服务的,当前运营商eSIM业务集中全面恢复,电信已经全面恢复,移动大部分省份已经全面放开和多号App开通方式&…

20240107移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下调通能上网

20240107移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下调通能上网 2024/1/7 11:17 开发板:Firefly的AIO-3399J【RK3399】SDK:rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab …

Docker mysql 主从复制

目录 介绍:为什么需要进行mysql的主从复制 主从复制原理: ✨主从环境搭建 主从一般面试问题: 介绍:为什么需要进行mysql的主从复制 在实际的生产中,为了解决Mysql的单点故障已经提高MySQL的整体服务性能&#xff…

如何恢复Mac误删文件?

方法1. 使用撤消命令 当你在 Mac 上删除了错误的文件并立即注意到你的错误时,你可以使用撤消命令立即恢复它。顾名思义,此命令会反转上次完成的操作,并且有多种方法可以调用它。如果你已经采取了其他操作或退出了用于删除文件的应用程序&…

算法与数据结构之数组(Java)

目录 1、数组的定义 2、线性结构与非线性结构 3、数组的表现形式 3.1 一维数组 3.2 多维数组 4、重要特性:随机访问 5、ArrayList和数组 6、堆内存和栈内存 7、数组的增删查改 7.1 插入数据 7.2 删除一个数据 7.3 修改数组 7.4 查找数据 8、总结 什么…

蓝桥杯基础知识2 全排列 next_permutation(), prev_permutation()

蓝桥杯基础知识2 全排列 next_permutation()&#xff0c; prev_permutation() #include<bits/stdc.h> using namespace std;int a[10];int main(){for(int i 1; i < 4; i)a[i] i; //4*3*2*1 24bool tag true;while(tag){for(int i1; i < 4; i)cout << a[…

Fiddler工具 — 8.会话列表(Session List)

1、会话列表说明 Fiddler抓取到的每条HTTP请求&#xff08;每一条称为一个session&#xff09;。 主要包含了请求的ID编号、状态码、协议、主机名、URL、内容类型、body大小、进程信息、自定义备注等信息。如下图&#xff1a; 说明&#xff1a; 名称含义#抓取HTTP Request的顺…

电脑如何屏幕录制?轻松录制高清视频

在当今信息化的时代&#xff0c;电脑已经成为工作和生活的重要工具。无论是在进行演示、教学还是记录重要操作步骤时&#xff0c;屏幕录制都是非常有用的。可是电脑如何屏幕录制呢&#xff1f;本篇文章将介绍三种常见的电脑屏幕录制方法&#xff0c;通过学习这些方法&#xff0…

[C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh

【官方框架地址】 https://github.com/takuya-takeuchi/DlibDotNet 【算法介绍】 DlibDotNet是一个开源的.NET库&#xff0c;用于实现机器学习和计算机视觉应用。它基于C库dlib&#xff0c;通过C/CLI封装了dlib的所有功能&#xff0c;为.NET开发者提供了简单易用的API。以下是…

力扣刷题记录(29)LeetCode:695、1020、130

695. 岛屿的最大面积 这道题和计算岛屿周长类似&#xff0c;在这里dfs的功能就是由一块陆地出发&#xff0c;找出这块陆地所在的岛屿并返回岛屿面积。 class Solution { public:int dfs(vector<vector<int>>& grid,int i,int j){if(i<0||i>grid.size())…

微信小程序 获取地址信息(uniapp)

参考API地址&#xff1a;微信小程序JavaScript SDK | 腾讯位置服务 <script> // 引入SDK核心类&#xff0c;js文件根据自己业务&#xff0c;位置可自行放置var QQMapWX require(../../js/uploadImg/qqmap-wx-jssdk.js);export default {data(){return{qqmapsdk:}},onL…