CV笔记1:颜色空间介绍及转换

目录

一、颜色空间介绍

1.1 RGB模型

1.2 CMYK模型

1.3 YUV(YCbCr)模型

1.4 HSI模型

1.5 HSV(HSB)模型

二、颜色空间转换

2.1 RGB转灰度图

2.2 RGB和HSV相互转换

2.3 RGB和HSI相互转换

2.4 RGB和YUV相互转换

参考


一、颜色空间介绍

颜色空间也称彩色模型(又称彩色空间或彩色系统)它的用途是在某些标准下用通常可接受的方式对彩色加以说明。 本质上,彩色模型是坐标系统和子空间的阐述。位于系统的每种颜色都有单个点表示。现在使用的彩色模型很多,主要是由于彩色科学是一个包括很多应用的很宽的领域。 在彩色图像处理中,选择合适的彩色模型是很重要的。从应用的角度来看,人们提出的众多彩色模型可以分为两类。一类面向诸如彩色显示器或彩色打印机之类输出显示场合使用的硬设备。另一类面向视觉感知或者说以彩色处理分析为目的的应用,如动画中的彩色图形,各种图像处理的算法等。 

颜色空间是一系列颜色的数学表现形式。从面对对象主要分为两大类模型:面对硬件设备的色彩模型和面对视觉感知的色彩模型。

  • 面向硬件设备的色彩模型:三种最流行的颜色模型是RGB(用于计算机图形);YIQ,YUV或YCbCr(用于视频系统)和CMYK(用于彩色打印)。但是,这三种颜色没有一种和我们直觉概念上的色调,饱和度,亮度有直接的联系。

  • 面向视觉感知的色彩模型:HSI、HSB(HSV)等模型,它们能简化编程,处理和终端用户操作。

 

 

1.1 RGB模型

RGB颜色模型是三维直角坐标颜色系统中的一个单位立方体。在正方体的主对角线上,各基色的量相等,产生由暗到亮的白色,及灰度。常用于电视、摄像机和彩色扫描仪等显示器的色彩模型。缺点是色彩空间不够均匀,不够直观,不符合人的认知心理,即颜色间的认知差异不能用空间上两点的距离来表示。

1.2 CMYK模型

CMYK是一种依靠反光的色彩模式,同时也是应用了减色系统。减色系统说明了绘画颜料产生颜色的方式,颜料能够吸收相反色,未吸收的部分被反射。

主要是在彩色打印中用到的色彩模型。青(cyan)、品红(magenta)、黄(yellow)和黑(black),其中为避免与蓝色混淆,黑色用最后一个字母K表示。

 

 

1.3 YUV(YCbCr)模型

YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法。在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y(即U)、B-Y(即V),最后发送端将亮度和两个色差总共三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V信号分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。

YUV主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异。

常用于肤色检测和影像连续处理的色彩模型。Y为颜色的亮度(luma)成分,而Cb和Cr则为蓝色和红色的浓度偏移量成份。主要的子采样格式有 YCbCr 4:2:0、YCbCr 4:2:2 和 YCbCr 4:4:4。

1.4 HSI模型

以色调(hue)、饱和度(saturation)和亮度(intensity)三种基本特征量来感知颜色。HSI模型的建立基于两个重要的事实:第一,分量与图像的彩色信息无关;第二,H和S分量与人感受颜色的方式是紧密相联的。这些特点使得HSI模型非常适合彩色特性检测与分析。

色调H(Hue):与光波的波长有关,它表示人的感官对不同颜色的感受,如红色、绿色、蓝色等,它也可表示一定范围的颜色,如暖色、冷色等。H的值对应指向该点的矢量与R轴的夹角。

饱和度S(Saturation):表示颜色的纯度,纯光谱色是完全饱和的,加入白光会稀释饱和度。饱和度越大,颜色看起来就会越鲜艳,反之亦然。三角形中心的饱和度最小,越靠外饱和度越大。

亮度I(Intensity):对应成像亮度和图像灰度,是颜色的明亮程度。模型中间截面向上变白(亮);向下变黑(暗)。

1.5 HSV(HSB)模型

HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法。HSV即色相(Hue)、饱和度(Saturation)、明度(Value),又称HSB(B即Brightness)。HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。

H表示色彩信息,即所处的光谱颜色的位置。角度量来表示,红、绿、蓝分别相隔120度。互补色分别相差180度。

S表示为纯度,越高色彩越纯,低则逐渐变灰,为比例值,范围从0到100%的数值,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。

V表示色彩的明亮程度,范围从0到1,最亮值为1,最暗值为0。有一点要注意:它和光强度之间并没有直接的联系。

二、颜色空间转换

2.1 RGB转灰度图

基础

  对于彩色转灰度,有一个很著名的心理学公式:

                          Gray = R*0.299 + G*0.587 + B*0.114

整数算法

  而实际应用时,希望避免低速的浮点运算,所以需要整数算法。

  注意到系数都是3位精度的没有,我们可以将它们缩放1000倍来实现整数运算算法:

                          Gray = (R*299 + G*587 + B*114 + 500) / 1000

  RGB一般是8位精度,现在缩放1000倍,所以上面的运算是32位整型的运算。注意后面那个除法是整数除法,所以需要加上500来实现四舍五入。

  就是由于该算法需要32位运算,所以该公式的另一个变种很流行:

                          Gray = (R*30 + G*59 + B*11 + 50) / 100

  但是,虽说上一个公式是32位整数运算,但是根据80x86体系的整数乘除指令的特点,是可以用16位整数乘除指令来运算的。而且现在32位早普及了(AMD64都出来了),所以推荐使用上一个公式。

整数移位算法

  上面的整数算法已经很快了,但是有一点仍制约速度,就是最后的那个除法。移位比除法快多了,所以可以将系数缩放成 2的整数幂。

  习惯上使用16位精度,2的16次幂是65536,所以这样计算系数:

                          0.299 * 65536 = 19595.264 ≈ 19595

                          0.587 * 65536 + (0.264) = 38469.632 + 0.264 = 38469.896 ≈ 38469

                          0.114 * 65536 + (0.896) =   7471.104 + 0.896 = 7472

注:式中同时乘于65536,相当于左移位运算的 << 16.

  可能很多人看见了,我所使用的舍入方式不是四舍五入。四舍五入会有较大的误差,应该将以前的计算结果的误差一起计算进去,舍入方式是去尾法。

  写成表达式是:

                          Gray = (R*19595 + G*38469 + B*7472) >> 16

  2至20位精度的系数:

                          Gray = (R*1 + G*2 + B*1) >> 2

                          Gray = (R*2 + G*5 + B*1) >> 3

                          Gray = (R*4 + G*10 + B*2) >> 4

                          Gray = (R*9 + G*19 + B*4) >> 5

                          Gray = (R*19 + G*37 + B*8) >> 6

                          Gray = (R*38 + G*75 + B*15) >> 7

                          Gray = (R*76 + G*150 + B*30) >> 8

                          Gray = (R*153 + G*300 + B*59) >> 9

                          Gray = (R*306 + G*601 + B*117) >> 10

                          Gray = (R*612 + G*1202 + B*234) >> 11

                          Gray = (R*1224 + G*2405 + B*467) >> 12

                          Gray = (R*2449 + G*4809 + B*934) >> 13

                          Gray = (R*4898 + G*9618 + B*1868) >> 14

                          Gray = (R*9797 + G*19235 + B*3736) >> 15

                          Gray = (R*19595 + G*38469 + B*7472) >> 16

                          Gray = (R*39190 + G*76939 + B*14943) >> 17

                          Gray = (R*78381 + G*153878 + B*29885) >> 18

                          Gray = (R*156762 + G*307757 + B*59769) >> 19

                          Gray = (R*313524 + G*615514 + B*119538) >> 20

  仔细观察上面的表格,这些精度实际上是一样的:3与4、7与8、10与11、13与14、19与20

  所以16位运算下最好的计算公式是使用7位精度,比先前那个系数缩放100倍的精度高,而且速度快:

                          Gray = (R*38 + G*75 + B*15) >> 7

  其实最有意思的还是那个2位精度的,完全可以移位优化:

                          Gray = (R + (WORD)G<<1 + B) >> 2

2.2 RGB和HSV相互转换

RGB颜色空间中,三种颜色分量的取值与所生成的颜色之间的联系并不直观。而HSV颜色空间,更类似于人类感觉颜色的方式,封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”。

从RGB转到HSV的计算公式为:针对一种颜色,设max等于r、g和b中的最大者,min为最小者。对应的HSV空间中的(h,s,v)值为:

h在0到360°之间,s在0到100%之间,v在0到max之间。

从HSV空间转回RGB空间的公式为:

2.3 RGB和HSI相互转换

HSI色彩空间和RGB色彩空间只是同一物理量的不同表示法,因而它们之间存在着转换关系:HSI颜色模式中的色调使用颜色类别表示,饱和度与颜色的白光光亮亮度刚好成反比,代表灰色与色调的比例,亮度是颜色的相对明暗程度。 由于HSI空间中亮度和色度具有可分离性,使得图像处理和机器视觉中大量灰度处理算法都可在HSI空间方便进行。

(1)RGB2HSI

HSI转RGB的公式为:给定 HSI空间中的 (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 的时候,可以使用下列过程:

2.4 RGB和YUV相互转换

将RGB 和YUV 的范围都放缩到 [0,255],则在值域为[0,255]下常用的转换公式如下:

1、YUV2RGB:

2、RGB2YUV:

以RGB2YUV为例---优化1:除浮点运算

浮点型运算比较耗时,我们希望用整数计算代替浮点型,我们首先去掉浮点型运算,等式两边乘以256:

 化简上述公式:

这里要说明一下:我们这里的转换是有损的,适用于追求速度,而对效果要求不是100%准确的情况。

然后,我们就可以对上述公式进一步优化,彻底去掉小数:

实际上就是四舍五入,为什么要乘以256,这是实际上是为了缩小误差,当然你这个地方乘数越大,误差越小。

 以RGB2YUV为例---优化2:乘法和除法变为移位运算

 消除所有乘法,用移位运算表示:

上述公式,我们可以用移位进行简单优化:

做到此处,已经没有了浮点运算量了,但是我们发现虽然采用了移位运算,但是,公式中还有很多乘法运算,乘法跟移位运算相比,还是效率太低了,因此,我们将把所有乘法都改成移位运算:

 Y= ((R << 6) + (R << 3) + (R << 2) + R + (G << 7) + (G << 4) + (G << 2) + (G << 1) + (B << 4) + (B << 3) + (B << 2) + B) >> 8

 U= (-((R << 5) + (R << 3) + (R << 1)+ R) - ((G << 6) + (G << 4) + (G << 2)+G) + (B << 7) + 32768) >> 8

 V= ((R << 7) - ((G << 6) + (G << 5) + (G << 3) + (G << 3) + G) - ((B << 4) + (B << 2) + B) + 32768 )>> 8

至此,RGB2YUV的转换公式就优化完毕了,这个优化,在移动端,速度会有很大的提高。YUV2RGB的优化过程也是一样的。

 

参考

1.色彩空间与色彩模型 RGB/CMYK/YCbCr/HSB/HSI/HSV

2.从RGB色转为灰度色算法

3.OpenCV图像处理专栏一 | 盘点常见颜色空间互转

4.数字图像处理 颜色空间RGB、HSI、CMYK、YUV的相互转换

5.YUV 格式与 RGB 格式的相互转换公式及C++ 代码

6.色彩转换系列之RGB格式与YUV格式互转原理及实现

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值