图像分割-Grabcut法(C#)

2024-01-04

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

本文的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,否则为255
                    if (matr[j, i] == 0 || matr[j, i] == 2)
                        matr[j, i] = 0;
                    else
                        matr[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;
                    else
                        matrx[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 教程 目录

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

图像分割-Grabcut法(C#) 的相关文章

  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • 双击定时器事件

    我正在开发一个应用程序 将用户的眼球运动与光标运动映射起来 从而开发一个免提光标控制系统 我正在使用 Open CV 库的 NET Wrapper for C 即 Emgu CV 进行开发 我被困在想要打开文件 文件夹的地方 这样当光标放在
  • OpenCV 中“IplImage”和“CvMat”的全称是什么?

    有一个IplImage and CvMat在 OpenCV 中 他们的全名是什么 IPL in IplImage代表英特尔处理库 这是Intel维护OpenCV时的残余 CV in cvMat代表计算机视觉矩阵 这是图形中常用的数据结构 I
  • C# EmguCV 错误“OpenCV: u != 0”

    我不断收到这个OpenCV u 0尝试匹配某些照片时出错 我的方法看起来像这样 ImageFile 类有一些变量 即使我试图匹配一张照片 它也会这样做 堆栈跟踪是 未处理的异常 Emgu CV Util CvException OpenCV
  • 如何使用 OpenCV 从图像中获取调色板 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想提取图像的调色板 类似于此 来自 我需要它来提取特定的颜色 如黄色 绿色和棕色 并显示该颜色覆盖的区域的百分比 另外 我可以添加更
  • 如何使用Java OpenCV

    我正在使用图像处理开始我的最后一年项目 并希望完成类似的事情this http www youtube com watch v EPai5f2sWaA 它是人体和物体检测的结合 我真的很想用 Java 来做 因为我在 C 方面的经验很少 I
  • 从 2 个摄像头捕获(OpenCV、Python)[重复]

    这个问题在这里已经有答案了 所以我试图从 openCV 中的两个摄像头 python 和 windows 7 进行捕获 我用一台相机拍摄的效果很好 你也会注意到我正在对图像做一些时髦的事情 但这并不重要 这是尝试使用两个的代码 import
  • 对同色像素块的边界进行着色

    我有一张有 5 种不同颜色的图像 在这种情况下 随机生成 w h 40 27 img Image new RGB w h pixels img load available colors r 255 13 18 b 72 64 255 y
  • 图像的 EMGU/OpenCV FFT 未产生预期结果

    我正在尝试使用 EMGU 可视化图像的 FFT 这是我正在处理的图像 这是预期的结果 Here s what I get 这是我的代码 Image
  • 警告:发生了非法反射访问操作(java 中的便携式 opencv)

    我想做一个便携的opencv将依赖项添加到 maven 文件的应用程序pom xml 简化的代码是 import org opencv core Mat public class Builder public static void mai
  • VideoCapture 未检测到 uEye 摄像头

    我的 uEye 相机遇到了一个问题 使用我的笔记本电脑摄像头 id 0 或 USB 上的网络摄像头 id 1 此行完美运行 TheVideoCapturer open 1 TheVideoCapturer 属于 VideoCapture 类
  • 如何将k4a_image_t转换为opencv矩阵? (Azure Kinect 传感器 SDK)

    我开始尝试使用 Azure Kinect Sensor SDK 我经历了官方操作指南 https learn microsoft com en us azure Kinect dk about sensor sdk sensor sdk 我
  • OpenCV 读取视频文件时内存不足

    此示例从文件中读取视频cv2 VideoCapture在 python OpenCV 中内存不足 import cv2 cap cv2 VideoCapture file mp4 while True ret frame cap read
  • 在 Python 中使用音频流 RTMP 通过管道和 OpenCV 到 FFmpeg

    我正在尝试使用音频流式传输 FFmpeg 我将在下面展示我的代码 导入模块 import subprocess as sp 创建变量 rtmpUrl rtmp a rtmp youtube com live2 key camera path
  • 如何将 Opencv VideoWriter 与 GStreamer 结合使用?

    我正在尝试使用 Opencv VideoWriter 传输 h264 流 以使用 VideoCapture 将其传输到网络上的另一台电脑上 但是 我被困在 VideoWriter 上 执行此代码会返回错误 并且 out isOpened 始
  • OpenCV:将垫子除以标量的最简单方法是什么

    我认为标题中已经包含了很多内容 显然我可以迭代和划分 但我认为有一种内置的方法 我看见cvConvertScale但这不适用于类型cv Mat 我知道标量乘法的缩放运算 cv Mat M float alpha cv Mat Result
  • 寻找两个框架之间的变换

    我有来自视频源的两个连续帧 并且我使用 FAST 算法检测这两个帧的关键点 我使用平方差之和法 SSD 来匹配关键点 所以基本上我已经匹配了两个框架之间的关键点 现在我想根据匹配的关键点集计算两个帧之间的仿射变换 缩放 旋转 平移 我知道如
  • 线程“main”java.lang.UnsatisfiedLinkError中出现异常:java.library.path中没有opencv_java249

    我目前正在尝试在我的 32 位笔记本电脑上设置 OpenCV 但我不断收到一条令我困惑的错误消息 Exception in thread main java lang UnsatisfiedLinkError no opencv java2
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac

随机推荐

  • 服务器经常出现自动重启怎么办

    服务器自动重启是一个复杂且常见的问题 可能由多种原因引起 从硬件故障到软件问题 从电源问题到散热问题 每一个环节都可能成为服务器的杀手 在处理此类问题时 需要我们有一套完整的策略和方案 以便快速准确地定位并解决问题 1 硬件检查 首先 我们
  • 医疗保健科技公司遭遇网络攻击,预计影响 450 万客户

    Bleeping Computer 网站消息 美国医疗保健技术公司 HealthEC LLC 遭遇一次严重网络安全事件 约 450 万客户的敏感信息被泄露 这一数字占据了其注册会员的一半以上 HealthEC 提供的人口健康管理 PHM 平
  • Linux 命令之 dpkg 的简单使用

    查询已安装的软件包及其依赖关系 dpkg s name
  • CMake中引入第三方库

    CMake中 如果我们需要引入第三方库 首先想到的是用find package函数 的确 如果我们引入的第三方库是一些比较标准的库如OpenCV可以用下面的代码 set OpenCV DIR xxxx xxxx目录包含OpenCVConfi
  • 软件测试开发/全日制丨Web端测试—JavaScript讲解 学习笔记

    本文转自测试人社区 霍格沃兹测试开发学社学员笔记 原文链接 https ceshiren com t topic 29440 一 简介 JavaScript 是脚本语言 一种轻量级的编程语言 是可插入 HTML 页面的编程代码 插入 HTM
  • 思科认证 | CCIE在线学习平台推荐!

    CCIE作为思科认证的 最高级别 备受网络专业人士推崇 那么CCIE认证 难不难 想要学习思科认证 是否有在线学习平台可以推荐 如果拿到了CCIE证书 证书会不会过期 如果会 是否有重认证的必要 01 CCIE网络工程师考试难吗 CCIE考
  • bokeh,一个超强的 Python 库详解

    概要 数据可视化在数据分析和报告中扮演着关键角色 而Python的Bokeh库为创建交互式 具有吸引力的可视化图表提供了强大的工具 本文将介绍Bokeh的基本概念 安装方法以及详细的示例代码 以帮助大家了解如何使用Bokeh创建出色的数据可
  • 开发&测试必须知道的 10种 常见软件架构模式

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 1k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 全国(山东、安徽)职业技能大赛--信息安全管理与评估大赛题目+答案讲解——操作系统取证

    博主介绍 博主介绍 大家好 我是 hacker routing 很高兴认识大家 主攻领域 渗透领域 应急响应 python VulnHub靶场复现 面试分析 点赞 评论 收藏 养成习惯 一键三连 欢迎关注 一起学习 一起讨论 一起进步 文末
  • Python 微服务架构指南

    概要 微服务架构作为一种设计风格 它将应用程序构建为一套小服务的集合 每个服务实现特定的业务功能 这些服务可以独立部署 扩展并围绕特定业务能力构建 Python 凭借其简洁易读的语法和强大的库生态系统成为实现微服务的受欢迎选择 本文将详细介
  • 40个高质量VUE毕设项目分享【源码+论文】(三)

    文章目录 前言 题目1 基于SSM的婚纱摄影网站 br 题目2 基于SSM的家教应聘招聘系统 br 题目3 基于SSM的家庭食谱管理系统 br 题目4 基于SSM的驾校预约管理系统 br 题目5 基于SSM的教师工
  • Ubuntu18.04 升级Ubuntu20.04

    文章目录 背景 升级方法 遇到的问题 背景 因项目环境需要 欲将Ubuntu18 04升级至Ubuntu20 04 参考网上其他小伙伴的方法 也遇到了一个问题 特此记录一下 希望能帮助其他有同样问题的小伙伴 升级方法 参考 第十五章 Ubu
  • 智康护精神病人体征监测系统

    智康护精神病人体征监测系统是一种针对精神病人的监测系统 旨在通过持续 准确地监测患者的生理和心理指标 提供有效的辅助管理和干预手段 以下是对该系统的介绍 实施背景 精神疾病对患者和社会都带来了巨大的负担 及时监测患者体征可以提供重要的信息
  • 【openlayers-6】控件

    1 视图跳转控件 const ZoomToExtent new ol control ZoomToExtent extent 116 30 120 40 map addControl ZoomToExtent 2 放大缩小控件 const
  • 【LeetCode:114. 二叉树展开为链表 | 二叉树 + 递归】

    算法题 算法刷题专栏 面试必备算法 面试高频算法 越难的东西 越要努力坚持 因为它具有很高的价值 算法就是这样 作者简介 硕风和炜 CSDN Java领域新星创作者 保研 国家奖学金 高中学习JAVA 大学完善JAVA开发技术栈 面试刷题
  • 题解 | #删除字符串中出现次数最少的字符# 利用map统计

    比预期的要低 HR打电话说是14级 不分ABC 说制造类供应链类工资和研发体系不一样 整体就要低一些 offer选择 大家帮忙看看 offer选择 大家帮忙看看 有奖活动 什么事是你实习了才知道的 春招会有好的国央企吗 招前端实习生 北京快
  • extractor-java 用法备忘录

    需要先反编译一下 反编译其实是不能用它里面自带的那个 class2java py 我这里的建议是自己先用 jd gui 反编译 然后保存一下 但是如果你的 jar 包特别多 也会生成很多的 zip 这里写一个脚本提取一下 import os
  • hw蓝队初级的一次面试(基础)

    OWASP top10 1 失效的访问控制 越权 2 加密失败 3 注入 4 不安全的设计 5 安全配置错误 6 易受攻击和过时的组件 7 认证和授权失败 8 软件和数据完整性故障 9 安全日志记录和监控失效 10 服务端请求伪造 ssrf
  • 苹果Vision Pro将于1月27日上市!

    在无数期待中 苹果全新产品Vision Pro头显终于定下上市日期 彭博社记者马克 古曼 Mark Gurman 于近日在X 前推特 平台爆料了这一信息 预计苹果Vision Pro头显将于2024年1月27日率先在美国上市 在过去看来遥不
  • 图像分割-Grabcut法(C#)

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