opencv RGB2HVS

article/2025/10/17 5:01:28

RGB色彩空间和HSV色彩空间的理解

本文的结构如下: 
1、RGB色彩空间 
2、HSV色彩空间(附HSV颜色分量范围表) 
3、RGB到HSV的转换的Demo 
  使用OpenCV实现RGB转HSV,并通过滑动条动态设定HSV阈值 
  自己写程序,实现RGB转HSL

 

1、RGB色彩空间

RGB色彩空间源于使用阴极射线管的彩色电视,RGB分别代表三个基色(R-红色、G-绿色、B-蓝色),具体的色彩值由三个基色叠加而成。在图像处理中,我们往往使用向量表示色彩的值,如(0,0,0)表示黑色、(255, 255, 255)表示白色。其中,255表示色彩空间被量化成255个数,最高亮度值为255(255 = 2^8 - 1,即每个色彩通道用8位表示)。在这个色彩空间中,有256*256*256种颜色。RGB色彩空间如下图所示(图片来自百度百科)。是一个包含Red、Green、Blue的三维空间。

这里写图片描述

注: 
1、在OpenCV中,RGB色彩空间的顺序是BGR,千万不要弄错了 
2、在Java的Bitmap中,RGB色彩空间被表示为ARGB,其中A代表透明度

2、HSV色彩空间

HSV色彩空间(Hue-色调、Saturation-饱和度、Value-值)将亮度从色彩中分解出来,在图像增强算法中用途很广。在我本人接触的图像处理项目中,经常将图像从RGB色彩空间转换到了HSV色彩空间,以便更好地感知图像颜色,利用HSV分量从图像中提取感兴趣的区域。

HSV色彩空间也被称为HSB(色调、饱和度、亮度),在PS中常被用到。

HSV色彩空间如下图所示,用一个倒圆锥体表示整个色彩空间:

这里写图片描述

注: 
1、H的范围是[0,360),S和V的范围是[0,1]。但是在OpenCV 中,HSV好像被规范化到了[0, 255],此处求大神指导。 
2、另外,网上有人总结了HSV颜色对应RGB的分量范围,见下面的表格。参考自: 
http://www.cnblogs.com/wangyblzu/p/5710715.html 
http://blog.csdn.net/taily_duan/article/details/51506776

这里写图片描述

3、RGB到HSV的转换的Demo

(1) 使用OpenCV的cv2.cvtColor(src, cv2.COLOR_BGR2HSV)

OpenCV为我们提供了现成的函数cvtColor(),帮助我们将图像从BGR转换到HSV。

# -*- coding:utf-8 -*-import cv2"""
功能:读取一张图片,显示出来,并转化为HSV色彩空间
"""
image = cv2.imread('images/my_wife2.jpg') # 根据路径读取一张图片
cv2.imshow("BGR", image) # 显示图片# 转化图片到HSV色彩空间
dst = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.imshow("HSV", dst) # 显示图片
cv2.waitKey(0) # 等待键盘触发事件,释放窗口

结果如下:

这里写图片描述

挺好看的美女,结果被弄成了这个样子。一些初学者包括我自己有时会问,为什么要把好端端的图片转成HSV色彩空间呢。其实这样做大有用处,比如我们要提取美女的头发区域,就可以通过设置HSV色彩空间的高低阈值来做。

# -*- coding:utf-8 -*-import cv2
import numpy as np   # ------------------改变1"""
功能:读取一张图片,显示出来,并转化为HSV色彩空间
"""
image = cv2.imread('images/my_wife2.jpg') # 根据路径读取一张图片
cv2.imshow("BGR", image) # 显示图片# 转化图片到HSV色彩空间
dst = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.imshow("HSV", dst) # 显示图片# 根据HSV提取头发 --------------------------------改变2
low_hsv = np.array([0, 0, 46])
high_hsv = np.array([200, 40, 220])
dst = cv2.inRange(dst, low_hsv, high_hsv)
cv2.imshow("result", dst) # 显示图片cv2.waitKey(0) # 等待键盘触发事件,释放窗口

程序的运行效果如下。我们看到,头发区域显示为白色,这样我们就初步地提取出了头发区域。当然这个效果并不理想,是因为我们设定的阈值不好,如果能动态地设定阈值就好了。

这里写图片描述

我们可以利用滑块动态地设置阈值,一边拖动滑块,一边观察图像。OpenCV提供了createTrackbar(),用于创建滑块。代码如下:

# -*- coding:utf-8 -*-import cv2
import numpy as np"""
功能:读取一张图片,显示出来,转化为HSV色彩空间并通过滑块调节HSV阈值,实时显示
"""image = cv2.imread('images/my_wife2.jpg') # 根据路径读取一张图片
cv2.imshow("BGR", image) # 显示图片hsv_low = np.array([0, 0, 0])
hsv_high = np.array([0, 0, 0])# 下面几个函数,写得有点冗余def h_low(value):hsv_low[0] = valuedef h_high(value):hsv_high[0] = valuedef s_low(value):hsv_low[1] = valuedef s_high(value):hsv_high[1] = valuedef v_low(value):hsv_low[2] = valuedef v_high(value):hsv_high[2] = valuecv2.namedWindow('image')
cv2.createTrackbar('H low', 'image', 0, 255, h_low) 
cv2.createTrackbar('H high', 'image', 0, 255, h_high)
cv2.createTrackbar('S low', 'image', 0, 255, s_low)
cv2.createTrackbar('S high', 'image', 0, 255, s_high)
cv2.createTrackbar('V low', 'image', 0, 255, v_low)
cv2.createTrackbar('V high', 'image', 0, 255, v_high)while True:dst = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # BGR转HSVdst = cv2.inRange(dst, hsv_low, hsv_high) # 通过HSV的高低阈值,提取图像部分区域cv2.imshow('dst', dst)if cv2.waitKey(1) & 0xFF == ord('q'):break
cv2.destroyAllWindows()

程序运行的效果如下,我们拉动滑块会自动改变HSV的高低阈值,进而根据高低阈值提取的图像区域也会改变:

这里写图片描述

(2) 自己编写程序实现RGB转HSL

根据维基百科,RGB转HSV的公式如下: 设 (r, g,b)分别是一个颜色的红、绿和蓝坐标,它们的值是在0到1之间的实数。设max等价于r,g和b中的最大者。设min等于这些值中的最小者。要找到在HSL空间中的 (h, s, l)值,这里的h ∈ [0,360)度是角度的色相角,而s, l ∈ [0,1]是饱和度和亮度,计算为:

这里写图片描述

如果要转化为HSV)h的值通常规范化到位于0到360°之间。而h = 0用于max = min的(就是灰色)时候而不是留下h未定义。HSL和HSV有同样的色相定义,但是其他分量不同。HSV颜色的s和v的值定义如下:

这里写图片描述

根据以上公式,我们可以写出RGB转HSV的代码:

def rgb2hsv(r, g, b):r, g, b = r / 255.0, g / 255.0, b / 255.0mx = max(r, g, b)mn = min(r, g, b)diff = mx - mn# 计算Hif mx == mn:h = 0elif mx == r:if g >= b:h = 60 * ((g - b) / diff) + 0else:h = 60 * ((g - b) / diff) + 360elif mx == g:h = 60 * ((b - r) / diff) + 120elif mx == b:h = 60 * ((r - g) / diff) + 240# 先计算Ll = (mx + mn) / 2.0# 再计算Sif mx == min:s = 0elif l > 0 and l <= 0.5:s = (diff / l) / 2.0elif l > 0.5:s = (diff / (1 - l)) / 2.0return h, s, l# 测试
h,s,l = rgb2hsv(200, 221, 221)
print('h=%f s=%f l=%f' % (h, s, l))

程序运行结果如下: 
这里写图片描述

可以根据颜色代码表,判断我们的结果是否正确

这里写图片描述

附:

1、 HSV转RGB的公式

类似的,给定在HSV中 (h, s, 
v)值定义的一个颜色,带有如上的h,和分别表示饱和度和明度的s和v变化于0到1之间,在RGB空间中对应的 (r, g, 
b)三原色可以计算为(R,G,B变化于0到1之间):

这里写图片描述

对于每个颜色向量 (r, g, b),

这里写图片描述

(参考自维基百科)

2、RGB转GRAY的公式

请见:http://blog.csdn.net/xdrt81y/article/details/8289963

总结: 
本文包括以下几个部分, 
1、RGB和HSV色彩空间的理解 
2、通过OpenCV实现了RGB到HSV的转换,包含一个使用滑动条的小例子 
3、根据RGB转HSL的公式,自己编程实现了RGB转HSL的程序。


http://chatgpt.dhexx.cn/article/xfGoVygk.shtml

相关文章

HVS颜色模型(六角锥体模型)

色调&#xff08;H&#xff09;&#xff1a;用角度度量&#xff0c;取值范围为0~360&#xff0c;从红色开始按逆时针方向计算&#xff0c;红色为0&#xff0c;绿色为120&#xff0c;蓝色为240、他们的补色是&#xff1a;黄色为60&#xff0c;青色为180&#xff0c;紫色为300&am…

ISP——HVS

本片博文是一篇笔记&#xff0c;是在看论文的时候碰到下面一段话&#xff0c;反复把论文看了三遍才弄懂&#xff0c;刚开始老觉得和gamma的特性是反的&#xff0c;还一度怀疑论文些错了&#xff0c;经过反复琢磨才弄明白&#xff0c;故此写下笔记记录 Higher gap in intensity…

HVS的真相

HVS的真相 人眼视觉系统&#xff08; human visual system&#xff0c;HVS&#xff09;是人类通过感知光线形成视觉的系统&#xff0c;是人类捕获外界信息最关键的系统之一。HVS在视频编码的主观优化中发挥重要作用。关于HVS有以下特性不得不知&#xff1a; HVS对高频信号的失…

人类视觉系统(Human Visual System,HVS)

人类通过人类视觉系统&#xff08;HVS&#xff09;来获取外界图像信息&#xff0c;当光辐射刺激人眼时&#xff0c;将会引起复杂的生理和心理变化&#xff0c;这种感觉就是视觉。 人类视觉系统&#xff08;HVS&#xff09;作为一种图像处理系统&#xff0c;它对图像的认知是非均…

数据库三范式与反范式详解(一看就懂)

目 录 范式与反范式1.第一范式2.第二范式3.第三范式4.反范式 范式与反范式 范式化设计 通过满足下面提出的三条范式规则&#xff0c;尽可能的避免出现数据冗余 因为数据冗余会带来&#xff0c;数据UPDATE更新遗漏问题&#xff08;毕竟SQL是人写的~&#xff09; 反范式化设计 目…

数据库三范式举例详解

整理不易&#xff0c;转发请注明出处&#xff0c;请勿直接剽窃&#xff01; 点赞、关注、不迷路&#xff01; 摘要&#xff1a; 1NF、2NF、3NF 关系型数据库一共有6种范式&#xff0c;越高的范式数据库冗余越小。一般情况下&#xff0c;在关系型数据库中通常将数据规范化为第三…

第十章 数据库三范式

概念 • 必须保证数据库设计的合理性 ​ 数据库设计关系整个系统的架构&#xff0c;关系到后续开发效率和运行效率 ​ 数据库的设计主要包含了设计表结构和表之间的联系 • 如何是合理数据库 ​ 结构合理 ​ 冗余较小 ​ 尽量避免插入删除修改异常 • 如何才能保证数据库设计水…

数据库三范式 事务

范式是具有最小冗余的表结构。 数据库三范式具体如下&#xff1a; 1、 第一范式(1st NF &#xff0d;列都是不可再分) 第一范式的目标是确保每列的原子性: 如果每列都是不可再分的最小数据单元&#xff08;也称为最小的原子单元&#xff09;&#xff0c;则满足第一范式&…

数据库三范式与反范式详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;数据库三范式与反范式详解 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林…

数据库三范式是什么?

什么是范式&#xff1f; 简言之就是&#xff0c;数据库设计对数据的存储性能&#xff0c;还有开发人员对数据的操作都有莫大的关系。所以建立科学的&#xff0c;规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。 什么是三…

数据库三范式简单理解

数据库设计当中三范式是经常遇到的&#xff0c;如果实际项目数据库设计中能达到第三范式基本也就满足要求了&#xff0c;那么如何快速有效的理解三个范式&#xff0c;同时应用于实际项目中去呢&#xff1f; 首先看看标准定义的三个范式&#xff1a; 第一范式&#xff08;1NF)…

数据库三大范式

数据库三大范式 数据库的设计范式是数据库设计所需要满足的规范&#xff0c;满足这些规范的数据库是简洁的、结构明晰的&#xff0c;同时&#xff0c;不会发生插入&#xff08;insert&#xff09;、删除&#xff08;delete&#xff09;和更新&#xff08;update&#xff09;操…

数据库三范式3NF指什么?

三范式面试的时候问的比较多&#xff0c;概念需要了解下&#xff1a; 数据库设计三大范式 为了建立冗余较小、结构合理的数据库&#xff0c;设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系…

数据库的三范式详细解释

1.定义 三范式是数据库的规范化的内容&#xff0c;所谓的数据库三范式通俗的讲就是设计数据库表所应该遵守的一套规范&#xff0c;如果不遵守就会造成设计的数据库不规范&#xff0c;出现数据库字段冗余&#xff0c;数据的查询&#xff0c;插入等操作等问题。 注意&#xff1a;…

数据库三范式是什么?(3NF详解)

什么是范式&#xff1f; 范式是数据库设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 最常用的三大范式 第一范式(1NF)&#xff1a;属性不可分割&#xff0c;即每个属性都是不可分割的原子项。(实体的属性即表中的列) 第二范式(2NF)&#xff1a;满足第一…

数据库三范式【看了就有收获,最简单的例子解释】

1. 数据库的三范式是什么&#xff1f;&#xff1f;&#xff1f;&#xff1f; 范式规范&#xff0c;原则上是必须遵循的&#xff08;但是需求不同可以不遵循&#xff09;&#xff0c;特殊情况可以不遵循 第一范式&#xff08;1NF&#xff09;&#xff1a;符合数据表的原子性【…

Java面试题之数据库三范式是什么?

什么是范式&#xff1f; 简言之就是&#xff0c;数据库设计对数据的存储性能&#xff0c;还有开发人员对数据的操作都有莫大的关系。所以建立科学的&#xff0c;规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。 什么是三…

数据库的三大范式

1.为什么需要数据库设计2.范式(Normal Formal&#xff09;2.1范式概述2.2键和相关属性的概念2.3第一范式(1NF)2.4第二范式(2NF&#xff09;2.5第三范式(3NF&#xff09;2.6范式的优缺点 3.反范式化3.1概述3.2 反范式的新问题3.3反范式的适用场景 4.BCNF(巴斯范式) 文章是看尚硅…

数据库设计的三范式超详细详解

目录 写在前面 第一范式&#xff08;1NF&#xff09;&#xff1a;原子性&#xff08;存储的数据应该具有“不可再分性”&#xff09; 第二范式&#xff08;2NF&#xff09;&#xff1a;唯一性 (消除非主键部分依赖联合主键中的部分字段)&#xff08;一定要在第一范式已经满足…

FarPoint.Win.Spread 自定义表头

软件开发技术交流&#xff0c;同学习共进步&#xff0c;欢迎加群&#xff0c; 群号:169600532 最近C/S项目中用到FarPoint.Win.Spread&#xff0c;想在表头加个全选的checkbox&#xff0c;实现效果如图&#xff1a; 列的设置大家都清楚&#xff0c;直接可视化视图中设置该列Ce…