
从模式识别的角度看,彩色的颜色绝对是一个重要模式,在色彩基础上去实现目标识别是一个好的选项。然而颜色识别也需要一个泛化过程,BGR颜色转化成HSV就是一个好的泛化过程,说白了,在HSV上识别颜色比在BGR上更有利。
RGB颜色系统是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和,越混合亮度越高,即加法混合。
红、绿、蓝三个颜色通道每种色各分为256阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色灰度数值相同时,产生不同灰度值的灰色调,即三色灰度都为0时,是最暗的黑色调;三色灰度都为255时,是最亮的白色调。
RGB是常用的色彩表现方式,通过原色组合来表现色彩,不适合需要进行色彩模式识别的情况。另一方面,HSV以“鲜艳”和“亮度”等直观的方式表达颜色,因此可以表达“我想让这个颜色变亮/变暗”和“我想让这个颜色变亮”等感性的颜色更轻/更深”。
HSB又称HSV,表示一种颜色模式:在HSB模式中,H(hues)表示色相,S(saturation)表示饱和度,B(brightness)表示亮度HSB模式对应的媒介是人眼。
色调是定义特定颜色的元素,例如红色或绿色。由于颜色是按圆形排列的,所以通常用 0° 到 360° 范围内的值来表示。这是色调值的颜色:

将上图的柱面展开是:

色相位表:
| 色相 | 以 RGB 表示颜色时 | |
| 0° | R:255 G:0 B:0 | |
| 0~60 | R:255 B:固定为0,G从0增加到255 | |
| 60° | R:255 G:255 B:0 | |
| 60~120 | G:255 B:固定为0,R从255减少到0 | |
| 120° | R:0 G:255 B:0 | |
| 120~180 | R:0 G:固定为 255,B 从 0 增加到 255 | |
| 180° | R:0 G:255 B:255 | |
| 180~240 | R:0 B:固定在255,G从255减少到0 | |
| 240° | R:0 G:0 B:255 | |
| 240~300 | G:0 B:固定为 255,R 从 0 增加到 255 | |
| 300° | R:255 G:0 B:255 | |
| 300~360 | R:255 G:固定为0,B从255减少到0 | |
| 360° | R:255 G:0 B:0 |
饱和度是表示由色调定义的颜色的鲜艳度和强度的元素,通常在 0% 到 100% 的范围内表示。100% 是最亮的,随着饱和度的降低,颜色在 0% 处逐渐变为灰色。

“鲜艳”是指红、绿、蓝分量之间的差异较大,而饱和度降低意味着分量之间的差异减小。)关于它。在 HSV 颜色空间中,去饱和向最强的红色、绿色和蓝色分量收敛。
亮度是表示由色调定义的颜色的明暗程度的元素,通常在 0% 到 100% 的范围内表示。100% 是最亮的,随着亮度的降低它会变暗,0% 是完全黑色的。

亮度定义为红色、绿色和蓝色的最高值,是在 0% 饱和度处收敛的颜色值。
在 HSV 颜色空间的情况下,当红色、绿色和蓝色分量之一最大化时,亮度变为 100%,因此红色 RGB (255,0,0) 和白色 RGB (255,255,255) 具有相同的亮度 100 %. 增加。因此,仅靠调整亮度是无法让红色RGB(255,0,0)更亮的,需要调整饱和度。“HSL 色彩空间”改进了这一点。
HSL的S(saturation)分量,指的是色彩的饱和度,它用0%至100%的值描述了相同色相、明度下色彩纯度的变化。数值越大,颜色中的灰色越少,颜色越鲜艳,呈现一种从灰度到纯色的变化。

HSL的L(lightness)分量,指的是色彩的明度,作用是控制色彩的明暗变化。它同样使用了0%至100%的取值范围。数值越小,色彩越暗,越接近于黑色;数值越大,色彩越亮,越接近于白色。

首先解释最好理解的明度(Lightness):
我们引入一个三维直角坐标系,三个坐标轴分别代表R、G、B的数量。由于此数值有限,所以取值范围会在立体空间里形成一个正方体。任何一个RGB颜色制式中的色彩取值,都会对应到这个立方体内的一点。

现在我们从原点(0,0,0)到对角的顶点(255,255,255)连出一条直线,也就是一条体对角线。这条对角线就可以说是一条明度轴了,原点最暗,另一端最亮。而任何一个颜色对应到的一点在这条体对角线上的“投影”,就是这个颜色的明度(Lightness)。靠近原点就越暗,靠近(255,255,255)就越亮。
然后我们需要再引入一个极坐标系,来解释饱和度(Saturation)和色相(Hue)。

极坐标系由角度轴和距离轴构成。把红蓝绿三个颜色分别置于角度轴的0°、120°、240°,此时色相就被角度轴来表示。从图中也可以看到,从0°到120°中间的区域就是橙色、黄色这些红色到绿色的过渡颜色,其他区域也是同理,每个色相都映射一个角度。而让原点的颜色为灰色,越往外颜色越鲜艳,则距离轴代表的就是饱和度。
这里我们再借助向量,把R、G、B映射到角度轴,R、G、B的数值为距离轴,绘制三个向量。假设我们现在有一个颜色,R=100,G=150,B=200,那我们就在极坐标中,画一个坐标为(100,0°)的向量,一个坐标为(150,120°)的向量,一个坐标为(200,240°)的向量。

然后把这三个向量做向量的加法,最终会落在一个点上。这个点的角度轴数值就是此颜色的色相,而距离轴数值就是它的饱和度了。蓝色箭头终点即为此色,色相210°,饱和度50%。
不过,这个极坐标是一个二维坐标,不能表示RGB颜色制式中的所有颜色,只能解释色相和饱和度。如何使其表示所有颜色?我们需要再添加一个纵轴,变成了这样:

这里添加的这根纵轴就是亮度(Brightness)。而这个模型就是HSB模型/HSV模型。此外,对于HSL模型,就是把Brightness轴替换成Lightness轴,替换后其顶层所有颜色都为白色。
顶层的纵坐标是255,白色是255,红色也一样是255,顶层大家的“光的量”Brightness都是最大值。底层的坐标是0,白色是0,红色也是0,所以说亮度是表示单个颜色的含量的。但是红色在上一个三维直角模型中,其投影并未到明度轴的顶点,其三数值平均值只有255/3=85,远不到最大值255,“与白色的相近程度”还明显差得很远。
因此也有人用下面这个色环模型来表示HLS模型:

模型确立后,就可以研究如何进行转换了。
三个指标如果综合在一起看的话,可以用下图来显示:


HSL 和 HSV 二者都把颜色描述在圆柱体内的点,这个圆柱的中心轴取值为自底部的黑色到顶部的白色而在它们中间是的灰色,绕这个轴的角度对应于“色相”,到这个轴的距离对应于“饱和度”,而沿着这个轴的距离对应于“亮度”,“色调”或“明度”。
设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSL 空间中的 (h, s, l) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, l ∈ [0,1] 是饱和度和亮度,计算为:



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


给定 HSL 空间中的
(h, s, l) 值定义的一个颜色,带有 h 在指示色相角度的值域 [0, 360)中,分别表示饱和度和亮度的s 和 l 在值域 [0, 1] 中,相应在 RGB 空间中的
(r, g, b) 三原色,带有分别对应于红色、绿色和蓝色的 r, g 和 b 也在值域 [0, 1] 中,它们可计算为:
首先,如果 s = 0,则结果的颜色是非彩色的、或灰色的。在这个特殊情况,r, g 和 b 都等于 l。注意 h 的值在这种情况下是未定义的。
当 s ≠ 0 的时候,可以使用下列过程:[1]




(h 规范化到值域 [0,1)内)




对于每个颜色向量 Color =
(ColorR, ColorG, ColorB) = (r, g, b),


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





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

文中参考资料:
https://blog.csdn.net/zhangping1987/article/details/73699335
https://blog.csdn.net/jiangxinyu/article/details/8000999
https://blog.csdn.net/hw140701/article/details/53174965