EmguCV学习笔记 VB.Net 4.2 二值化
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客
教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客
笔者的博客网址:https://blog.csdn.net/uruseibest
教程配套文件及相关说明以及如何获得pdf教程和代码(博客上的教程内容会和pdf教程一致,教程中也会包含所有代码),请移步:EmguCV学习笔记
4.2 二值化
4.2.1 Threshold
Threshold方法用于对图像进行二值化处理,将图像中的像素值转换为0或255,以便于后续的图像分割、形状检测等处理。该方法只能处理灰度图像,如果要对彩色图像进行二值化处理,需要先将其转换为灰度图像。此外,在使用Threshold方法时,还需要根据实际情况选择不同的二值化操作类型,以达到最佳的处理效果。
Threshold的声明如下:
Public Shared Function Threshold(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, threshold As Double, maxValue As Double, thresholdType As Emgu.CV.CvEnum.ThresholdType) As Double
参数说明:
- src:原始图像,通常是Mat类型。
- dst:输出图像,通常是Mat类型。
- thresh:阈值,Double类型。
- maxval:最大值,Double类型,在二值化操作中,将大于阈值的像素值设为该值。
- type:二值化操作的类型,ThresholdType类型,包括以下常量:
- Binary:二值化操作,将大于阈值的像素值设为maxval,小于等于阈值的像素值设为0。
- BinaryInv:反向二值化操作,将小于等于阈值的像素值设为maxval,大于阈值的像素值设为0。
- Trunc:截断操作,将大于阈值的像素值设为阈值,小于等于阈值的像素值不变。
- ToZero:零值操作,将小于等于阈值的像素值设为0,大于阈值的像素值不变。
- ToZeroInv:反向零值操作,将大于阈值的像素值设为0,小于等于阈值的像素值不变。
- Otsu:使用大津法,通过分析图像的灰度直方图,自动确定最佳的阈值,从而实现二值化,可以适用于大部分图像的二值化处理。如果使用了此类型,那么thresh参数将忽略。
- Triangle:使用Triangle算法,通过寻找直方图中的三角形区域,自动确定最佳的阈值,从而实现二值化。如果使用了此类型,那么thresh参数将忽略。
返回值:
返回ThresholdType为Otsu 或Triangle时,确定的最佳阈值(threshold的参数的值);如果ThresholdType不是Otsu 或Triangle,那么就返回设定的阈值。
【代码位置:frmChapter4】Button2_Click
'Threshold
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'可以直接使用ImreadModes.Grayscale,这里为了直观对比使用彩色图像
Dim m As New Mat("C:\learnEmgucv\lena.jpg", ImreadModes.Color)
ImageBox1.Image = m
'灰度转换
Dim mgray As New Mat
CvInvoke.CvtColor(m, mgray, ColorConversion.Bgr2Gray)
Dim mOut1 As New Mat
'使用Binary类型进行二值化
CvInvoke.Threshold(mgray, mOut1, 125, 255, ThresholdType.Binary)
ImageBox2.Image = mOut1
Dim mOut2 As New Mat
Dim thresh As Double
'使用大律法自动确定阈值进行二值化,并返回使用Otsu计算出的阈值
thresh = CvInvoke.Threshold(mgray, mOut2, 0, 255, ThresholdType.Otsu)
ImageBox3.Image = mOut2
End Sub
运行后如下图所示:
图4-3 图像二值化
4.2.2 AdaptiveThreshold
AdaptiveThreshold方法用于对图像进行自适应阈值处理,将图像中的像素值转换为0或255,以便于后续的图像分割、形状检测等处理。该方法只能处理灰度图像,如果要对彩色图像进行自适应阈值处理,需要先将其转换为灰度图像。
AdaptiveThreshold方法的声明如下:
Public Shared Sub AdaptiveThreshold(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, maxValue As Double, adaptiveType As Emgu.CV.CvEnum.AdaptiveThresholdType, thresholdType As Emgu.CV.CvEnum.ThresholdType, blockSize As Integer, param1 As Double)
主要参数说明:
- maxValue:最大值,Double类型,在二值化操作中,将大于阈值的像素值设为该值。
- adaptiveMethod:自适应阈值处理的方法,AdaptiveThresholdTyp类型,包括以下常量:
- MeanC:阈值为邻域内的均值减去一个常数(param1)。
- GaussianC:阈值为邻域内的高斯加权平均值减去一个常数(param1)。
- thresholdType:二值化操作的类型,只能是ThresholdType类型的Binary或者BinaryInv。
- blockSize:邻域大小,必须为大于3的奇数。
- param1:常数,Double类型,表示从均值或高斯加权均值中减去的常数。
【代码位置:frmChapter4】Button3_Click
'AdaptiveThreshold
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim m As New Mat("C:\learnEmgucv\lena.jpg", ImreadModes.Color)
ImageBox1.Image = m
'彩色转为灰度
Dim mgray As New Mat
CvInvoke.CvtColor(m, mgray, ColorConversion.Bgr2Gray)
Dim mOut1 As New Mat
'使用高斯加权平均值进行二值化
CvInvoke.AdaptiveThreshold(mgray, mOut1, 255, AdaptiveThresholdType.GaussianC, ThresholdType.Binary, 3, 0)
ImageBox2.Image = mOut1
Dim mOut2 As New Mat
'使用均值进行二值化
CvInvoke.AdaptiveThreshold(mgray, mOut2, 255, AdaptiveThresholdType.MeanC, ThresholdType.Binary, 3, 0)
ImageBox3.Image = mOut2
End Sub
运行后如下图所示:
图4-4 使用AdaptiveThreshold进行图像二值化
4.2.3 图像通道分离和合并
图像通道的分离和合并分别使用到了CvInvoke的Split和Merge方法。Merge方法在2.3.11节【图像通道的分离与合并】有介绍,而CvInvoke.Split方法和该节的Mat.Split方法有所区别,详细请看代码说明。
【代码位置:frmChapter4】Button4_Click
'通道分离和合并
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim m As New Mat("C:\learnEmgucv\lena.jpg", ImreadModes.Color)
ImageBox1.Image = m
'将图像通道分离到 VectorOfMat
Dim vom As New VectorOfMat()
CvInvoke.Split(m, vom)
Dim mOut1 As New Mat
'输出分离后的第一个通道
mOut1 = vom(0)
ImageBox2.Image = mOut1
'注意和CvInvoke.Split的对比
Dim channels() As Mat = m.Split()
'对三个通道分别进行二值化
CvInvoke.Threshold(channels(0), channels(0), 100, 255, CvEnum.ThresholdType.Binary)
CvInvoke.Threshold(channels(1), channels(0), 100, 255, CvEnum.ThresholdType.Binary)
CvInvoke.Threshold(channels(2), channels(0), 100, 255, CvEnum.ThresholdType.Binary)
'将处理后的三个通道推入 VectorOfMat
Dim newm As New VectorOfMat
newm.Push(channels(0))
newm.Push(channels(1))
newm.Push(channels(2))
Dim mdst As New Mat
'合并通道
CvInvoke.Merge(newm, mdst)
ImageBox3.Image = mdst
End Sub
运行后如下图所示:
图4-5 图像通道的分离和合并
4.2.4 按颜色分离
CvInvoke.InRange方法用于在图像中找到指定范围内的像素,并将其设置为白色,其余的像素设置为黑色。在使用CvInvoke.InRange方法时,需要根据实际情况选择合适的下限和上限,以达到最佳的处理效果。同时,CvInvoke.InRange方法只能处理单通道和三通道的图像。如果图像通道数不为1或3,需要先将其转换为单通道或三通道图像。
InRange方法的声明如下:
Public Shared Sub InRange(src As Emgu.CV.IInputArray, lower As Emgu.CV.IInputArray, upper As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray)
主要参数说明:
lowerb参数是指定范围的下限。
upperb参数是指定范围的上限。
【代码位置:frmChapter4】Button5_Click
'颜色分离
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
Dim m As New Mat("C:\learnEmgucv\wslt.jpg", ImreadModes.Color)
ImageBox1.Image = m
Dim hsv As New Mat
'转为Hsv,更容易分离颜色
CvInvoke.CvtColor(m, hsv, ColorConversion.Bgr2Hsv)
'设置颜色范围下限和上限,需要根据实际慢慢修改
Dim lowerb1 As New ScalarArray(New MCvScalar(0, 10, 180))
Dim upperb1 As New ScalarArray(New MCvScalar(50, 160, 255))
Dim dst As New Mat
'使用InRange分离颜色,返回二值图
CvInvoke.InRange(hsv, lowerb1, upperb1, dst)
ImageBox2.Image = dst
Dim dstchannel3 As New Mat()
'转为3通道图像
CvInvoke.CvtColor(dst, dstchannel3, ColorConversion.Gray2Bgr)
Dim result As New Mat()
'做And运算,然后显示分离结果
CvInvoke.BitwiseAnd(m, dstchannel3, result)
ImageBox3.Image = result
End Sub
运行后如下图所示:
图4-6 InRange方法分离出人脸
相关文章:

EmguCV学习笔记 VB.Net 4.2 二值化
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问:EmguCV学习笔记 C# 目录-CSD…...
Spark大数据分析案例
目录 案例概述环境搭建1. Spark单机环境2. Spark集群环境 数据集数据预处理 Spark作业编写提交Spark作业 数据可视化可能遇到的问题及解决方法结论 案例概述 本案例将介绍如何在单机和集群环境下使用Apache Spark进行大数据分析,最终使用Python实现数据的可视化。我…...

【数据结构】关于Java对象比较,以及优先级队列的大小堆创建你了解多少???
前言: 🌟🌟Hello家人们,这期讲解对象的比较,以及优先级队列堆,希望你能帮到屏幕前的你。 🌈上期博客在这里:http://t.csdnimg.cn/MSex7 🌈感兴趣的小伙伴看一看小编主页&…...

HQChart使用教程101-创建内置键盘精灵
HQChart使用教程101-创建内置键盘精灵 键盘精灵步骤1. 创建键盘精灵实例2. 设置事件回调3. 初始化键盘精灵4. 设置码表数据5. 监听"keydown","mousedown" 交流QQ群HQChart代码地址键盘精灵源码 完整实例 键盘精灵 键盘精灵是一种便捷操作软件的功能工具&a…...

nginx基础配置
1. https配置 首先在nginx.conf中配置https 2. 重定向 rewrite ^/(.*)$ https://www.sxl1.com/$1 permanent;3. 自动索引 autoindex on;4. 缓存 Nginx expire缓存配置: 缓存可以降低网站带宽,加速用户访问location ~ .*\.(gif|jpg|png)$ {expires 365d;roo…...

怿星科技与您相约——2024 Testing Expo
汽车测试及质量监控博览会(中国)Testing Expo China-Automotive 怿星科技展位路线 届时欢迎莅临2057号展台!...

mac本地搭建docker+k8s步骤
概览: * kubectl安装 * minikube安装 * dashboard安装 主机配置: * mac M2 (arm架构) 服务及版本概览: 服务名称版本 kubectl v1.29.2 Kubernetes v1.30.0 kicbase v0.0.44 dashboard v2.7.0 docker 26.…...
JS DOM、点击事件
JS DOM 加载事件onload js代码执行的时候,需要html&css的支持 onload在页面加载完之后执行 dom:用JS对html标签进行增删改查 元素节点获取 var name document.getElementById("userName"); var inputs document.getElementsByTagNam…...
长短期记忆网络(LSTM)预测模型及其Python和MATLAB实现
## 一、背景 长短期记忆(Long Short-Term Memory, LSTM)网络是由 Sepp Hochreiter 和 Jrgen Schmidhuber 在 1997 年提出的一种特殊的循环神经网络(RNN)结构。LSTM 旨在解决传统 RNN 在处理长序列数据时常见的梯度消失和梯度爆炸…...

C语言——操作符详解
目录 1.操作符的分类 2.原码、反码和补码 3.移位操作符 3.1 左移操作符 3.2 右移操作符 4.位操作符 4.1 按位与& 4.2 按位或| 4.3 按位异或^ 编辑 4.4 按位取反~ 4.5 应用题 4.5.1 题目:不能创建临时变量,实现两个整数的交换 4.5.2 …...
【Linux】内核全量函数添加日志打印摸索
1、操作系统在空载时要把函数调用次数非常多的注释掉,这里打印时不能带进程名称,高执行概率函数不同进程执行到的概率也很高,不然操作业务会增加卡死的概率; 2、卡死一般是调用次数太多导致,会卡住操作系统十多秒&…...
24/8/17算法笔记 CQL算法离线学习
离线学习:不需要更新数据 CQL(Conservative Q-Learning)算法是一种用于离线强化学习的方法,它通过学习一个保守的Q函数来解决标准离线RL方法可能由于数据集和学习到的策略之间的分布偏移而导致的过高估计问题 。CQL算法的核心思想…...

C++第十一弹 -- STL之List的剖析与使用
文章索引 前言1. list的介绍2 list的使用2.1 list的构造函数2.2 iterator的使用2.3 list capacity2.4 list element access2.5 list modifiers 3. list的迭代器失效4. list与vector的对比总结 前言 本篇我们旨在探讨对于STL中list的使用, 下一篇我们将会对list进行底层剖析以及…...

物流快递外卖管理平台系统-计算机毕设Java|springboot实战项目
🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…...
开源BaaS 平台介绍
以下是几款常见的开源后端平台,它们提供了用户管理、权限验证、文件存储、API 管理等类似的后端功能。 1. Parse Server 简介: Parse 是一个非常流行的开源后端服务平台,它最初由 Facebook 开发,后来开源。它支持用户管理、数据存储、文件存…...

分享一个基于python爬虫的“今日头条”新闻数据分析可视化系统(源码、调试、LW、开题、PPT)
💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…...
QT自定义信号槽
1.自定义信号槽 使用connect()可以让我们连接系统提供的信号和槽,同时也可以自定义信号槽。 例如以学生和老师构建类同时当老师触发信号下课同学收到信号执行“吃饭”这一动作代码示例 #include "SignalAndSlot.h" //Teacher Student 总框架…...

one-shot 序列图像红外小目标分割
one-shot 序列图像红外小目标分割 IEEE TRANSACTIONS ON GEOSCIENCE AND REMOTE SENSING 代码还未开源 GitHub - D-IceIce/one-shot-IRSTS few-shot:利用少量标注样本进行学习 one-shot: 属于few-shot的特殊情况,只用一个样本进行学习 zero-shot&am…...
JavaScript 单线程防阻塞的原理
JavaScript 是一种单线程语言,这意味着它一次只能执行一个任务。这种设计可能会导致一些问题,比如当遇到耗时的操作时,整个程序可能会被阻塞。为了解决这个问题,JavaScript 使用了事件循环和回调函数的机制,实现了非阻塞式的异步操作。 事件循环 JavaScript 有一个事件队列,用…...

Shell脚本发送邮件的详细步骤与配置方法?
Shell脚本发送邮件的进阶技巧?怎么配置Shell脚本发信? 使用Shell脚本发送邮件是一种高效的自动化手段,特别是在需要定期发送报告、通知或警告信息时。AokSend将详细介绍Shell脚本发送邮件的步骤与配置方法,帮助您更好地掌握这一技…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...