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脚本发送邮件的步骤与配置方法,帮助您更好地掌握这一技…...

如何把Phalcon 集成到PhpStorm里面
一 背景 按照上一篇文章里面写的Phalcon 创建项目过程中的一些坑, 最终我们在终端可以基于Phalcon命令创建对应的开发项目。但在这个过程中,存在一个问题:那就是写代码的时候,发现Phalcon对应的依赖提示都没有,如下: 从上面这个截图来看,就能发现,Phalcon的啥…...

python从入门到精通:循环语句
目录 前言 1、while循环的基础语法 2、while循环的嵌套 3、for循环的基础语法 range语句: for循环临时变量作用域: 4、for循环的嵌套 5、循环中断:break和continue 前言 循环普遍存在于日常生活中,同样,在程序中…...

Codeforces Round 965 (Div. 2)
前言 有人在过七夕,我在打 cf ,还有某人独自一人在学校机房,凌晨一点骑上共享单车回宿舍欣赏沿途的秋风扫落叶。 Standings:2166 题目链接:Dashboard - Codeforces Round 965 (Div. 2) - Codeforces A. Find K Distin…...

Win10下载安装Mysql服务
Win10下载安装MySQL 一、官网下载MySQL 1.官网地址: https://www.mysql.com/ 2.在官网首页拉到最下方,点击MySQL Community Server: 3.根据个人电脑的操作系统选择,此处以Windows x64为例,选择第2个,点击…...

MVVM(Model-View-ViewModel)架构模式
在Android开发中,MVVM(Model-View-ViewModel)架构模式已经成为构建可维护和可扩展应用程序的重要选择。MVVM模式通过分离视图(View)、模型(Model)和视图模型(ViewModel)来…...

C#MVC返回DataTable到前端展示。
很久没写博客了,闭关太久,失踪人口回归,给诸位道友整点绝活。 交代下背景:要做一个行转列的汇总统计,而且,由于是行转列,列的数量不固定,所以,没法使用正常的SqlSugar框…...

HttpUtils工具类(二)Apache HttpClient 5 使用详细教程
目录 一、Apache HttpClient 5介绍 (1)核心特性 (2)Apache HttpClient 5 的新特性 (3)在 Java 项目的主要使用场景及缺点 使用场景: 缺点: 二、在实际项目中的应用 …...

Vue3.0生命周期钩子(包含:Vue 2.0 和 Vue 3.0)
1、Vue 2.0 生命周期钩子 每个应用程序实例在创建时都有一系列的初始化步骤。例如,创建数据绑定、编译模板、将实例挂载到 DOM 并在数据变化时触发 DOM 更新、销毁实例等。在这个过程中会运行一些叫做生命周期钩子的函数,通过这些钩子函数可以定义业务逻…...

遥感之常用各种指数总结大全
目前在遥感领域基本各种研究领域都会用到各种各样的指数,如水体指数,植被指数,农业长势指数,盐分指数,云指数,阴影指数,建筑物指数,水质指数,干旱指数等等众多。 本文对上…...

【C++】C++11新增特性
目录 C11简介: 1、统一的列表初始化: std::initializer_list 2、自动类型推导: auto: decltype: 3、final 和 override final: override: 4、默认成员函数控制: 显示缺省…...