RGB 转HSV空间颜色寻找色块
文章目录
- 前言
- 一、绿色确定
- 二、红色确定
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
项目需要:
将RGB颜色空间转换为HSV颜色空间以寻找颜色,主要基于以下几个原因:
-
直观性:
HSV颜色空间更符合人类对颜色识别的直观性。在HSV中,H(色调)代表颜色本身,S(饱和度)代表颜色的纯度,V(明度)代表颜色的亮度。这种分离使得颜色的描述更加直观,便于进行颜色特征的提取和处理。相比之下,RGB颜色空间是通过红、绿、蓝三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,对于人类来说,直接从RGB值判断颜色并不直观。 -
颜色分割:
HSV颜色空间在进行色彩分割时具有显著优势。通过设定色调(H)的阈值,可以很容易地将特定颜色从图像中分割出来。例如,要提取红色区域,只需设置色调在0°(或360°)附近的阈值即可。而RGB颜色空间中的颜色分割则相对复杂,因为不同颜色在RGB空间中的分布是连续的,难以通过简单的阈值进行分割。 -
光照不变性:
HSV颜色空间在一定程度上对光照变化具有鲁棒性。由于V(明度)通道表示颜色的亮度,因此可以通过调整V的值来适应不同的光照条件。这在进行颜色识别时非常有用,因为光照变化往往会影响图像的亮度,但不会改变颜色的本质特征。相比之下,RGB颜色空间对光照变化较为敏感,因为RGB值直接反映了像素的亮度信息。 -
计算效率:
在某些情况下,HSV颜色空间可能具有更高的计算效率。例如,在进行颜色特征提取时,由于HSV颜色空间的直观性和分离性,可以使用更简单的算法来提取颜色特征。而RGB颜色空间则需要更复杂的算法来处理颜色特征提取问题。
综上所述,将RGB颜色空间转换为HSV颜色空间以寻找颜色具有诸多优势。这种转换不仅提高了颜色识别的准确性和效率,还使得颜色特征的提取和处理更加直观和方便。因此,在图像处理、计算机视觉和机器视觉等领域中,HSV颜色空间得到了广泛应用。
一、绿色确定
// 这里以绿色为例,你可以根据需要调整这些值
cv::Scalar lowerBound(35, 40, 40); // 下界(HSV)
cv::Scalar upperBound(85, 255, 255); // 上界(HSV)
在HSV(Hue, Saturation, Value)颜色空间中,绿色的范围并不是固定的,它取决于多种因素,包括光照条件、摄像头的白平衡设置、以及你想要识别的绿色色调的具体类型(比如深绿、浅绿、草绿等)。
在上面的代码中,给出的绿色范围(lowerBound
和 upperBound
)是一个相对宽泛的界定,用于捕捉大多数常见的绿色色调。这里的值是基于HSV颜色空间中的色调(Hue)、饱和度(Saturation)和明度(Value)来设定的:
-
Hue(色调):色调表示颜色的类型,从0到179(在OpenCV中,HSV的色调是循环的,所以180和0是相等的)。绿色的色调通常落在35到85之间(这个范围可能会根据具体情况有所变化)。
-
Saturation(饱和度):饱和度表示颜色的纯度,从0(灰色)到255(完全饱和)。在上面的例子中,饱和度的下界被设置为40,以排除过于灰暗的颜色(这些颜色可能由于光照不足或物体表面反射率低而显得不饱和)。上界被设置为255,以包括所有饱和的绿色。
-
Value(明度):明度表示颜色的亮度,也从0(黑色)到255(白色)。在这个例子中,明度的上下界都被设置为相对较高的值(40到255),以包括从较暗到较亮的绿色。然而,你也可以根据需要调整这些值来适应不同的光照条件。
需要注意的是,这些值并不是绝对的,而是根据经验和实验来确定的。在实际应用中,你可能需要根据你的具体需求和环境条件来调整这些值。例如,如果你正在处理一个户外场景,并且阳光充足,你可能需要调整这些值来适应更高的明度和不同的色调。相反,如果你正在处理一个室内场景,并且光照不足,你可能需要降低明度的下界来包括更暗的颜色。
二、红色确定
在OpenCV的C++环境中,为了定义一个用于提取红色区域的HSV掩码,你需要首先确定红色的HSV范围,然后利用cv::inRange
函数来生成这个掩码。以下是一个具体的例子,展示了如何定义红色的HSV范围并生成相应的掩码:
#include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image = cv::imread("your_image.jpg");// 检查图像是否加载成功if (image.empty()) {std::cerr << "Error: Could not load image!" << std::endl;return -1;}// 转换图像到HSV颜色空间cv::Mat hsvImage;cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV);// 定义红色的HSV范围// 注意:HSV的范围是H: 0-179, S: 0-255, V: 0-255// 红色通常位于H: 0-10 和 H: 160-179(近似),但这里我们仅考虑0-10的情况cv::Scalar lowerBound(0, 100, 50); // 下界(HSV):色调0-10,饱和度100,明度50cv::Scalar upperBound(10, 255, 255); // 上界(HSV):色调10,饱和度255,明度255// 创建一个掩码来提取红色区域cv::Mat mask;cv::inRange(hsvImage, lowerBound, upperBound, mask);// 如果你还想包括接近179到0过渡的红色(即循环的红色部分),你可以这样做:// 但是,由于HSV的色调是循环的,你需要将两个范围分开处理,然后合并结果// 这里我们为了简单起见,只处理0-10的范围// 使用掩码来提取红色区域(可选,仅用于显示或进一步处理)cv::Mat redRegion;image.copyTo(redRegion, mask);// 显示原始图像和红色区域cv::imshow("Original Image", image);cv::imshow("Red Region", redRegion);// 等待按键事件以关闭窗口cv::waitKey(0);return 0;
}
在这个例子中,lowerBound
和upperBound
定义了红色的HSV范围。cv::inRange
函数会检查hsvImage
中的每个像素,如果它的HSV值在这个范围内,则掩码mask
中对应的像素会被设置为255(白色),否则会被设置为0(黑色)。
请注意,由于光照条件、摄像头白平衡以及你想要识别的红色色调的具体类型,你可能需要调整lowerBound
和upperBound
中的值。特别是色调(Hue)的值,它们决定了哪些颜色会被认为是红色。在这个例子中,我们仅考虑了色调为0到10的情况,但实际应用中可能还需要包括接近179到0过渡的部分(即HSV色调的循环特性),这通常需要额外的逻辑来处理。
241
206.5
184.5
175
184
149
x= 241
y= 206.5
x= 184.5
y= 175
x= 184
y= 149
x= 240
y= 206
width= 2
height= 1
x= 159
y= 149
width= 51
height= 52
x= 176
y= 148
width= 16
height= 2
x= 184.5
y= 175
总结
学习使人快乐!
音乐使人愉悦!
日积月累使人充实和自信!
相关文章:

RGB 转HSV空间颜色寻找色块
文章目录 前言一、绿色确定二、红色确定总结 前言 提示:这里可以添加本文要记录的大概内容: 项目需要: 将RGB颜色空间转换为HSV颜色空间以寻找颜色,主要基于以下几个原因: 直观性: HSV颜色空间更符合人类…...

Spring Boot - 数据库集成04 - 集成Redis
Spring boot集成Redis 文章目录 Spring boot集成Redis一:redis基本集成1:RedisTemplate Jedis1.1:RedisTemplate1.2:实现案例1.2.1:依赖引入和属性配置1.2.2:redisConfig配置1.2.3:基础使用 2&…...

C++红黑树详解
文章目录 红黑树概念规则为什么最长路径不超过最短路径的二倍?红黑树的时间复杂度红黑树的结构插入叔叔节点情况的讨论只变色(叔叔存在且为红)抽象的情况变色单旋(叔叔不存在或叔叔存在且为黑)变色双旋(叔叔不存在或叔叔存在且为黑…...
与机器学习相关的概率论重要概念的介绍和说明
概率论一些重要概念的介绍和说明 1、 试验 (1)试验是指在特定条件下,对某种方法、技术、设备或产品(即,事物)进行测试或验证的过程。 (2)易混淆的概念是,实验。实验&…...
60.await与sleep的原理分析 C#例子 WPF例子
在异步任务中使用Thread.Sleep会阻塞当前线程,因其是同步操作,暂停线程执行而不释放资源。这与异步编程旨在避免线程阻塞的目的相冲突。尽管异步方法可能包含其他await调用,Thread.Sleep仍会立即阻塞线程,妨碍其处理其他任务或响应…...
数据库连接池是如何工作的?
连接池是一种用于管理和复用连接(如数据库连接或网络连接)的技术,广泛应用于数据库操作和网络请求中,以提高应用程序的性能和资源利用率。以下是连接池的工作原理和机制的详细解释: 连接池的工作原理 1. 初始化阶段 在应用程序启动时,连接池会根据配置参数预先创建一定…...

2025年01月26日Github流行趋势
项目名称:onlook 项目地址url:https://github.com/onlook-dev/onlook项目语言:TypeScript历史star数:4871今日star数:207项目维护者:Kitenite, drfarrell, iNerdStack, abhiroopc84, apps/dependabot项目简…...

C语言的灵魂——指针(1)
指针是C语言的灵魂,有了指针C语言才能完成一些复杂的程序;没了指针就相当于C语言最精髓的部分被去掉了,可见指针是多么重要。废话不多讲我们直接开始。 指针 一,内存和地址二,编址三,指针变量和地址1&#…...
vue2和vue3指令
Vue 2 和 Vue 3 的指令系统非常相似,但 Vue 3 在指令方面进行了优化和扩展。以下是 Vue 2 和 Vue 3 中指令的对比: 1. 通用指令 这些指令在 Vue 2 和 Vue 3 中都可以使用,功能一致: 指令说明v-bind绑定 HTML 属性或组件 propsv-…...

【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报
本文章介绍,Logstash进行自动采集服务器日志文件,并手把手教你如何在springboot项目中配置logstash进行日志自动上报与日志自定义格式输出给logstash。kibana如何进行配置索引模式,可以在kibana中看到采集到的日志 日志流程 logfile-> l…...

微信阅读网站小程序的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
通过配置核查,CentOS操作系统当前无多余的、过期的账户;但CentOS操作系统存在共享账户r***t
通过配置核查,CentOS操作系统当前无多余的、过期的账户;但CentOS操作系统存在共享 核查CentOS操作系统中的用户账户,可以使用以下命令: 查看当前活跃用户: awk -F: /\$1\$/{print $1} /etc/shadow 查看多余账户(非活跃账户&…...
Vue 3 30天精进之旅:Day 05 - 事件处理
引言 在前几天的学习中,我们探讨了Vue实例、计算属性和侦听器。这些概念为我们搭建了Vue应用的基础。今天,我们将专注于事件处理,这是交互式Web应用的核心部分。通过学习如何在Vue中处理事件,你将能够更好地与用户进行交互&#…...
.NET Core跨域
CORS 跨域通讯的问题。解决方案:JSONP、前端代理后端请求、CORS等。CORS原理:在服务器的响应报文头中通过access-control-allow-origin告诉浏览器允许跨域访问的域名。在Program.cs的“var appbuilder.Build()”这句代码之前注册 string[] urls new[] …...
笔试-二维数组2
应用 现有M(1<M<10)个端口组,每个端口组是长度为N(1<N<100),元素均为整数。如果这些端口组间存在2个及以上的元素相同,则认为端口组可以关联合并;若可以关联合并,请用二位数组表示输出结果。其中…...
vue中使用jquery 实现table 拖动改变尺寸
使用 CDN , 降低打包文件的大小在index.html中 <script src"https://.../cdns/jquery-1.12.4.min.js"></script>在 Vue 中使用 jQuery 一旦你引入 jQuery,你可以在 Vue 实例中使用它。有两种主要方式: 1. 使用全局变量 $ jQue…...

使用ensp进行ppp协议综合实验
实验拓扑 实验划分 AR1的Serial3/0/0接口:192.168.1.1/24; AR2的Serial3/0/0接口:192.168.1.2/24; AR2的Serial3/0/1和4/0/0的聚合接口:192.168.2.2/24; AR3的Serial3/0/0和3/0/1的聚合接口:192…...
什么是AGI
AGI(Artificial General Intelligence,人工通用智能)是指具备与人类相当或超越人类水平的通用智能的人工智能系统。与当前主流的**狭义人工智能(Narrow AI)**不同,AGI 能够像人类一样灵活地处理各种任务&am…...

RabbitMQ模块新增消息转换器
文章目录 1.目录结构2.代码1.pom.xml 排除logging2.RabbitMQConfig.java3.RabbitMQAutoConfiguration.java 1.目录结构 2.代码 1.pom.xml 排除logging <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/PO…...
验证二叉搜索树(力扣98)
根据二叉搜索树的特性,我们使用中序遍历,保证节点按从小到大的顺序遍历。既然要验证,就是看在中序遍历的条件下,各个节点的大小关系是否符合二叉搜索树的特性。双指针法和适合解决这个问题,一个指针指向当前节点&#…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...