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

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...