C#描述-计算机视觉OpenCV(4):图像分割

C#描述-计算机视觉OpenCV(4):图像分割

    • 前言
    • 用 GrabCut 算法分割图像
    • 实例展示

前言

本文中如果有什么没说明的地方,大概率在前文中描述过了。
C#描述-计算机视觉OpenCV(1):基础操作
C#描述-计算机视觉OpenCV(2):图像处理
C#描述-计算机视觉OpenCV(3):重映射
上一章节我们通过波形来分析了图像,那么图像中的背景与主体在波形上会有怎样的呈现呢?

for (int k = 120; k < 400; k++){int r = 390;XList4.Add(k);YList4.Add(img.At<Vec3b>(r, k)[1]);chart2.Series["Green"].Points.DataBindXY(XList4, YList4);XList5.Add(k);YList5.Add(img.At<Vec3b>(r, k)[2]);chart2.Series["Blue"].Points.DataBindXY(XList5, YList5);XList6.Add(k);YList6.Add(img.At<Vec3b>(r, k)[0]);chart2.Series["Red"].Points.DataBindXY(XList6, YList6);img.At<Vec3b>(r, k)[0] = 0;img.At<Vec3b>(r, k)[1] = 0;img.At<Vec3b>(r, k)[2] = 0;//检测线标记}

我们标记一条检测线并示波
在这里插入图片描述
色彩波形结果:
在这里插入图片描述

这种差别以为着我们可以通过数值的变化来捕捉图片中的物体,并且做出分割。

用 GrabCut 算法分割图像

物体通常有自己特有的颜色,通过识别颜色接近的区域,通常可以提取出这些颜色。OpenCV 提供了一种常用的图像分割算法,即 GrabCut 算法。GrabCut 算法比较复杂,计算量也很大,但结果通常很精确。如果要从静态图像中提取前景物体(例如从图像中剪切一个物体,并粘贴到另一幅图像),最好采用GrabCut 算法。
算法参数模型:
cv::Mat result; // 分割结果(四种可能的值)
cv::Mat bgModel,fgModel; // 模型(内部使用)
// GrabCut 分割算法
cv::grabCut(
image, // 输入图像
mask, // 分割结果
rectangle, // 包含前景的矩形
bgModel,fgModel, // 模型
X, // 迭代次数
cv::GC_INIT_WITH_RECT // 使用矩形
);
首先我们开出需要的模型:

Mat mask = new Mat();
Mat res = new Mat();
Mat bgM = new Mat();
Mat fgM = new Mat();

然后我们定义一个检测矩形区域:

Rect rectangle;
rectangle = new Rect(int X,int Y,int Width,int Height);

然后我们可以代入一个图像,使用GrabCut()方法,

Cv2.GrabCut(image, mask, rectangle, bgM, fgM, 5, GrabCutModes.InitWithRect);

并获得一个结果Mat类 mask。需要注意:这个mask可不代表分割完成的结果。
我们在函数的中用 InitWithRect 标志作为最后一个参数,表示将使用
带边框的矩形模型。矩形中输入/输出的分割图像可以是以下四个值之一。
1.GC_BGD:这个值表示明确属于背景的像素(例如本例中矩形之外的像素)。
2.GC_FGD:这个值表示明确属于前景的像素(本例中没有这种像素)。
3.GC_PR_BGD:这个值表示可能属于背景的像素。
4.GC_PR_FGD:这个值表示可能属于前景的像素(即本例中矩形之内像素的初始值)
也就是说我们的mask是一个判断是否为主题的结果的矩阵,我们还需要来操作读取才能完成图像分割,那么具体该如何操作呢?

实例展示

原图如下:
在这里插入图片描述
我们选取区域(200, 45, 150, 400)来做切割,这里面主体与背景非常清晰。

public void ColorDetector(Mat image){Mat mask = new Mat();Mat res = new Mat();Mat bgM = new Mat();Mat fgM = new Mat();Rect rectangle;rectangle = new Rect(200, 45, 150, 400);Cv2.GrabCut(image, mask, rectangle, bgM, fgM, 5, GrabCutModes.InitWithRect);Mat result = new Mat(mask.Rows, mask.Cols, MatType.CV_8UC1);for (int i = 0; i < mask.Rows; i++){for (int j = 0; j < mask.Cols; j++){byte v = mask.Get<byte>(j, i);switch (v){case 0:result.Set<byte>(j, i, 0);break;case 1:result.Set<byte>(j, i, 255);break;case 2:result.Set<byte>(j, i, 50);break;case 3:result.Set<byte>(j, i, 200);break;}}}Cv2.ImShow("grab", result);}

我们划分出四个结果类型的区域,来看看分割的是否准确:
在这里插入图片描述
通过色块可以看到,我们还是切割出来了的,找到我们需要的色块类型,进行还原,并将其他色块统一:

for (int i = 0; i < mask.Rows; i++){for (int j = 0; j < mask.Cols; j++){byte v = mask.Get<byte>(j, i);switch (v){case 0:result.Set<byte>(j, i, 0);break;case 1:result.Set<byte>(j, i, 0);break;case 2:result.Set<byte>(j, i, 0);break;case 3:result.At<Vec3b>(j, i)[0] = image.At<Vec3b>(j, i)[0];result.At<Vec3b>(j, i)[1] = image.At<Vec3b>(j, i)[1];result.At<Vec3b>(j, i)[2] = image.At<Vec3b>(j, i)[2];//result.Set<byte>(j, i, 200);break;}}}

在这里插入图片描述
分割成功!

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

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

相关文章

VTK —— 二、教程五 - 通过鼠标事件与渲染交互(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功&#xff0c;若无VTK库则请先参考如下链接编译vtk源码&#xff1a; VTK —— 一、Windows10下编译VTK源码&#xff0c;并用Vs2017代码测试&#xff08;附编译流程、附编译好的库、vtk测试源码&#xff09; 教程描述 本…

Unity类银河恶魔城学习记录15-3 p155 More example on audio effects

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ​ AudioManager.cs using System.Collections; using System.Collections.…

XYCTF2024 RE Trustme 复现

但是只得到用户名 admin 法一&#xff1a;猜Sql注入&#xff0c;直接万能密码 法二&#xff1a;正常逆向 jadx中的AndroidManifest.xml有奇怪之处 怀疑有加壳&#xff0c;进ProxyApplication看看 大量安卓一代壳的特征 Android第一代壳加固原理及实现 - 知乎 GitHub - Huye…

基于双层优化的电动汽车优化调度研究(附matlab程序)

基于双层优化的电动汽车优化调度研究 0.代码链接 基于双层优化的电动汽车优化调度研究(matlab程序)资源-CSDN文库 1.简述 关键词&#xff1a;双层优化 选址定容 输配协同 时空优化 参考文档&#xff1a;《考虑大规模电动汽车接入电网的双层优化调度策略_胡文平》…

confluence 设置https代理

使用nginx反待confluence并开启https后&#xff0c;登录confluence会一直提示&#xff1a;scheme、proxyName、proxyPort设置错误。 解决办法&#xff1a; find / -name server.xmlvi /opt/atlassian/confluence/conf/server.xml HTTP反代配置 HTTPS反代配置

[leetcode] 61. 旋转链表

文章目录 题目描述解题方法遍历java代码复杂度分析 相似题目 题目描述 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&…

ICode国际青少年编程竞赛- Python-1级训练场-for循环练习

ICode国际青少年编程竞赛- Python-1级训练场-for循环练习 1、 for i in range(3):Dev.step(4)Dev.turnLeft()2、 for i in range(3):Dev.step(2)Dev.turnRight()Dev.step(2)Dev.turnLeft()3、 for i in range(3):Dev.step(2)Dev.turnRight()Dev.step(2)Dev.turnLeft()4、 for…

Deep learning Part Five RNN--24.4.29

接着上期&#xff0c;CBOW模型无法解决文章内容过长的单词预测的&#xff0c;那该如何解决呢&#xff1f; 除此之外&#xff0c;根据图中5-5的左图所示&#xff0c;在CBOW模型的中间层求单词向量的和&#xff0c;这时就会出现另一个问题的&#xff0c;那就是上下文的单词的顺序…

PC通过串口发送指令控制LED+串口中断

如何让单片机接收数据&#xff1f; 首先要打开SCON中的串行接收控制位REN。当REN1时为允许接收状态&#xff0c;可以接收信息。 因此令SCON 0x50&#xff1b; 怎么知道收到数据&#xff1f; 利用RI接收中断请求标志位。当串行接收到第8位结束时由内部硬件自动置为RI1&#…

机器人系统ros2-开发实践04-ROS2 中 tf2的定义及示例说明

1. what ros2 tf2 &#xff1f; tf2的全称是transform2&#xff0c;在ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;它是专门用于处理和变换不同坐标系间位置和方向的库。这个名字来源于“transform”这个词&#xff0c;表示坐标变换&#xff0c;而“2”则…

【抽代复习笔记】17-群(十一):置换的练习题(1)

练习1&#xff1a;计算&#xff1a; 解&#xff1a; 解析&#xff1a;①左边的置换是1保持不变&#xff0c;2变成3&#xff0c;3变成4&#xff0c;4变成5&#xff0c;5变成2&#xff0c;因此可以简写为(2345)&#xff1b;右边的置换是2和5保持不变&#xff0c;1变成3&#xff…

k8s环境部署gpu以及CUDA兼容性分析

本文记录和学习在实用gpu搭建k8s支持上层应用时的功能实践和遇到的问题。 1. 基础概念 CUDA本质上就是NVIDIA专为通用高性能并行计算设计的一套计算平台和编程模型&#xff0c;换句话使用GPU并行编程的规范方法&#xff0c;所以CUDA在软件层面包含了众多库&#xff0c; 那这里…

万兴PDF专家 PDFelement Pro v10.3.8 破姐版!

&#x1f9d1;‍&#x1f4bb;万兴PDF专家 PDFelement Pro v10.3.8 破姐版 (https://docs.qq.com/sheet/DRVVxTHJ3RXJFVHVr)

docker mysql更新升级版本

一、环境说明 操作系统&#xff1a;Centos7 数据库版本&#xff1a;MySql 8.0.22 数据库中数据量不大&#xff0c;处于开发/测试环境&#xff0c;风险较低 二、升级原因 升级是因为测评漏洞&#xff0c;在进行国家三级等级保护测评过程中&#xff0c;漏扫发现多个MySql漏洞…

Linux学习之IP协议

前言&#xff1a; 在学习IP协议i前&#xff0c;我们其实知道网络协议栈是一层层的&#xff0c;上层封装好之后就传给下层&#xff0c;对于我们治安学习到的TCP协议&#xff0c;在对数据进行封装之后&#xff0c;并不是直接就将数据进行传输&#xff0c;而是交给下一层网络层进…

C++11 右值与移动语义

前言&#xff1a; 我们首先汇总一下在C11中新的变化&#xff1a; 1、新容器 —— unodered_xxx 2、新接口 cbegin等&#xff0c;无关痛痒initializer_list系列的构造push_xxx / insert / emplace 等增加右值引用插入版本&#xff0c;意义重大&#xff0c;提高效率容器新增移…

领域驱动设计(DDD)笔记(一)基本概念

文章链接 领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;一&#xff09;基本概念-CSDN博客领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;二&#xff09;代码组织原则-CSDN博客 DDD基本概念 DDD 是一种面向复杂需求的软件设计方法&#xff0c;将软件开…

【Vue3】openlayers加载瓦片地图并手动标记坐标点

目录 一、创建Vue3项目 二、openlayers加载瓦片地图&#xff08;引js文件版&#xff09; 2.1 将以下的文件复制到public下 2.2 index.html引入ol脚本 2.3 删除项目自带的HelloWorld.vue&#xff0c;创建Map.vue 2.4 编码Map.vue 2.5 修改App.vue 2.6 启动项目测试 三、…

通信光缆主要敷设方式有哪些(续)

在《通信光缆主要敷设方式有哪些》一文中&#xff0c;介绍了光缆的直埋、架空和管道敷设方式。此外&#xff0c;根据敷设场景的不同&#xff0c;光缆的常见敷设方式还包括&#xff1a;高铁槽道内敷设、水底敷设、墙壁敷设、引上、室内敷设等。 1 高铁槽道内光缆敷设 光缆顺沿高…

vscode设置免密登录远程服务器

文章目录 1. 问题描述2. 解决方案3. 原理 1. 问题描述 当我们使用vscode的ssh连接远程服务器后&#xff0c;过一段时间后&#xff0c;总是要求登录服务器的密码。 这就导致一个麻烦就是: 无论是在公司还是在学校&#xff0c;密码往往不是自己设置的&#xff0c;所以记忆起来就…