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)
根据二叉搜索树的特性,我们使用中序遍历,保证节点按从小到大的顺序遍历。既然要验证,就是看在中序遍历的条件下,各个节点的大小关系是否符合二叉搜索树的特性。双指针法和适合解决这个问题,一个指针指向当前节点&#…...

vue3 vue2区别
Vue 3 和 Vue 2 之间存在多个方面的区别,以下是一些主要的差异点: 1. 性能改进 Vue 3:在性能上有显著提升,包括更小的包体积、更快的渲染速度和更好的内存管理。Vue 2:性能相对较低,尤其是在大型应用中。…...

IOS 自定义代理协议Delegate
QuestionViewCell.h文件代码,定义代理协议 protocol QuestionViewCellDelegate <NSObject>- (void)cellIsOpenDidChangeAtIndexPath:(NSIndexPath *)indexPath;endinterface QuestionViewCell : UITableViewCellproperty (nonatomic, weak) id<QuestionVi…...

消息队列篇--扩展篇--码表及编码解码(理解字符字节和二进制,了解ASCII和Unicode,了解UTF-8和UTF-16,了解字符和二进制等具体转化过程等)
1、理解字符,int,字节以及二进制存储 (1)、字符 字符是文本的基本单位,例如字母(A, B, C)、数字(1, 2, 3)、标点符号(!, ?, ,)以及其他符号&am…...

2024年度总结——理想的风,吹进现实
2024年悄然过去,留下了太多美好的回忆,不得不感慨一声时间过得真快啊!旧年风雪尽,新岁星河明。写下这篇博客,记录我独一无二的2024年。这一年,理想的风终于吹进现实! 如果用一句话总结这一年&am…...

代码工艺:实践 Spring Boot TDD 测试驱动开发
TDD 的核心理念是 “先写测试,再写功能”,其过程遵循一个严格的循环,即 Red-Green-Refactor: TDD 的流程 1. Red(编写失败的测试) 根据需求,先编写一个测试用例,描述期望的行为。…...

深度学习|表示学习|卷积神经网络|通道 channel 是什么?|05
如是我闻: 在卷积神经网络(CNN)中,channel(通道) 是指输入或输出数据的深度维度,通常用来表示输入或输出的特征类型。 通道的含义 输入通道(Input Channels):…...

PCDN的虚拟机与云主机区别
使用虚拟机和云主机运行PCDN(P2P CDN)时,主要存在以下区别: 一、资源分配与灵活性 虚拟机: 资源受限:虚拟机运行在物理服务器上,其资源(如CPU、内存、带宽)受到物理服务…...

计算机网络 (57)改进“尽最大努力交付”的服务
前言 计算机网络中的“尽最大努力交付”服务是网络层的一种数据传输方式。这种服务的特点是网络层只负责尽力将数据报从源端传输到目的端,而不保证数据传输的可靠性。 一、标记与分类 为数据分组打上标记: 给不同性质的分组打上不同的标记&#x…...

Redis 详解
简介 Redis 的全称是 Remote Dictionary Server,它是一个基于内存的 NoSQL(非关系型)数据库,数据以 键值对 存储,支持各种复杂的数据结构 为什么会出现 Redis? Redis 的出现是为了弥补传统数据库在高性能…...

如何解压rar格式文件?8种方法(Win/Mac/手机/网页端)
RAR 文件是一种常见的压缩文件格式,由尤金・罗谢尔(Eugene Roshal)开发,因其扩展名 “rar” 而得名。它通过特定算法将一个或多个文件、文件夹进行压缩,大幅减小存储空间,方便数据传输与备份。然而…...