跳至内容
正式开始前,我们有必要介绍一下色彩模型。色彩模型有很多种类,比如RGB三原色模型、CMYK四原色模型、YUV/YCbCr颜色模型等,由于我们本章要进行RGB转YCbCr算法的实现,因此这里我们重点介绍RGB和YCbCr色彩模型。
1.1.RGB三原色模型
为了研究RGB三原色模型,我们需要从光线的底层物理组成开始分析。光也属于电磁波,有着同样的特性,这里给出了电磁波光谱图,如下图所示:
![](https://mmbiz.qpic.cn/mmbiz_png/hm4mHzT8NiceicCfIAk0oZc2TLph7X9t5JJuicJXPYyfQMHPZhnUa49WqwbZq8RU9ITSPKlKTquVDqMhdyF7kJGrw/640?wx_fmt=png)
图. 电磁波光谱图
在电磁波波段中,400nm~700nm范围内为可见光波段,即人类肉眼可见的光。大自然的色彩均是由可见光组成的:雨后见彩虹,或者三棱镜色散后呈现的“红橙黄绿青蓝紫”,便是自然光(白光)分解的结果。分解后的光频率与波长如下表所示:
![](https://mmbiz.qpic.cn/mmbiz_png/hm4mHzT8NiceicCfIAk0oZc2TLph7X9t5Ju7dp4rXz49N0WmianZsOHlkp16ZuvOOeiaUichIc1OibunGUlbGD2m1qRw/640?wx_fmt=png)
注:由于青色与蓝色、绿色有一定程度的交叉,笔者参考了很多资料,均没有给出明确的界限,因此这里暂不给出具体参数。
通过不同样色、不同深浅的组合,能够再现大自然五彩缤纷。而我们人眼能观察到色彩,是因为照射到物体上的电磁波(光线)反射,有人眼感应后所形成的结果。人眼能分辨出“红橙黄绿青蓝紫”,并不是因为人眼具有这7种感光细胞,而是通过另外一种组合——“RGB三原色模型”。
所谓三原色模型,是认为人眼里有三种感光细胞,分别对红色、绿色和蓝色最敏感。人眼之所以看到各种颜色的光,主要是这三种细胞感觉综合的结果,而红、绿、蓝三色被称为三原色。虽然在历史上,出于不同的原因,到底将哪三种颜色作为三原色,有过争论,现在根据不同目的也有不同的选择。但是,最广为人知的,依然是红 绿蓝(RGB)三色。人眼存在着三种颜色的感光细胞,成为锥状感光细胞。
人眼在光线充足的环境中,能见到五颜六色,而在在光线比较暗的情况下,只能观察到物理的敏感程度,却不能感受到五颜六色的斑斓。因此,相关研究表明,人眼还存在着另外一种可见光细胞——柱状细胞,对光线强度的感应。这四种感光细胞对波长的敏感程度如下所示:
![](https://mmbiz.qpic.cn/mmbiz_png/hm4mHzT8NiceicCfIAk0oZc2TLph7X9t5JutmKy3mMAH9AXNOguq4rlsGJTcj7vQgBTnysCfqqlfRrOLIic4Q03ow/640?wx_fmt=png)
这里RGB三种感光细胞都可覆盖可见光范围,但是每一种细胞最敏感的的波长不同。分别能感应RGB的细胞,被称为红视锥细胞、绿视锥细胞、蓝视锥细胞。而每一种细胞,并非刚刚好对准响应颜色的波长中心值,这一点主要取决于人眼,而非电磁波。人眼所看到的的彩色图像,是RGB以不同强度混合进入眼睛,综合出来的结果。由这三种细胞受到不同强度的反应结果,组合出的颜色,成为“三颜刺激”。
计算机中,使用最广泛的就是 RGB 三原色模型了。计算机使用离散的数字信号来描述数据,RGB 模型也不例外。对于RGB三原色的不同组合,能实现自然界真彩的斑斓。而针对同一强度的RGB三原色,可以组成23=8种颜色,如下图所示:
![](https://mmbiz.qpic.cn/mmbiz_png/hm4mHzT8NiceicCfIAk0oZc2TLph7X9t5Jxc8XReeAGqLj5uM3BzsdBQHicwsxJeV6xv7zKln52UW9mYFoAl8olBQ/640?wx_fmt=png)
饱和度均为100%的RGB三原色组合模式与组合后的结果如下表所示:
序号
|
R
|
G
|
B
|
Result
|
备注
|
1
|
1
|
0
|
0
|
RED
|
红
|
2
|
0
|
1
|
0
|
GREEN
|
绿
|
3
|
0
|
0
|
1
|
BLUE
|
蓝
|
4
|
1
|
1
|
1
|
WHITE
|
白
|
5
|
0
|
0
|
0
|
BLACK
|
黑
|
6
|
1
|
1
|
0
|
YELLOW
|
黄
|
7
|
1
|
0
|
1
|
CYAN
|
青
|
8
|
1
|
1
|
1
|
ROYAL
|
品
|
饱和度均为100%的RGB三原色能组合成8种颜色,那么当RGB饱和度在0~100%(色彩深度)变化,就能细分组合出更多的颜色。计算机处理的BMP图片,为24Bit的位图,即每一通道的颜色可以细分为28=256级别(RGB888),即每一通道的色彩分辨率能达到了256级,总共能综合出的颜色种类计算如下:
![](https://mmbiz.qpic.cn/mmbiz_png/hm4mHzT8NiceicCfIAk0oZc2TLph7X9t5J3pbFPx7Xuxic9OrOgqGna9vH7sp4uibUme84CDebwReW7q6Onl34AaKw/640?wx_fmt=png)
1.2.YCbCr色域介绍
YCbCr是在世界数字组织视频标准研制过程中,作为ITU – R BT.601 建议的一部分,其实是YUV经过缩放和偏移的翻版。YCbCr由Y(Luminance)、Cb(Chrominance-Blue)和Cr(Chrominance-Red)组成,其中Y表示颜色的明亮度和浓度,而Cb和Cr则分别表示颜色的蓝色浓度偏移量和红色浓度偏移量。
医学研究证明,人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到图像质量的变化。如果只有Y信号分量,而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。我们通常把YUV和YCbCr概念混在一起,但其实这两者还是有挺大的区别,主要区分介绍如下:
1)首先,YUV是一种模拟信号,其色彩模型源于RGB模型,即亮度与色度分离,适合图像算法的处理,常应用于在模拟广播电视中,其中Y∈ [0,1] U,V∈[-0.5,0.5] 。
2)其次,YCbCr是一种数字信号,其色彩模型源于YUV模型,它是YUV压缩和偏移的版本(所谓偏移就是从[-0.5,0.5] 偏移到[0,1 ],因此计算时候会加128),在数字视频领域应用广泛,是计算机中应用最多的格式,包括JPEG,MPEG,H.264/5, AVS等都采用YCbCr格式,我们通常广义的讲的YUV,严格的讲应该就是YCbCr。
YCbCr格式可以继续细分,有2种格式:tv range与full range,主要区别如下:
Y∈[16,235],Cb∈[16-240] ,Cr∈[16-240] ,主要是广播电视采用的数字标准;
Y、Cb、Cr∈[0-255] ,主要是PC端采用的标准,所以也称pc range。
关于为何tv range要量化到16-235,主要是由于YUV最终在模拟域传输,因此为了防止数模转换时引起过冲现象,于是将数字域限定在16-235。至于为什么选择16/235,可自行了解Gibbs Phenomenon吉布斯现象,这里不再继续展开。
所以RGB转YCbCr,得明确转tv range还是pc range;反之也可以通过像素值范围,去判断是tv range,还是pc range,甚至还得明确是什么格式范围,否则会导致偏色。如下图所示,为BT.601标准中YUV的UV坐标模型(U越大越蓝,V越大越红):
![](https://mmbiz.qpic.cn/mmbiz_png/hm4mHzT8NiceicCfIAk0oZc2TLph7X9t5JHrhhyB5VCiclxickP1mYZvWCI8r5PYtib1Q1M1TSicaYO5Showqia2eCibXA/640?wx_fmt=png)
1)针对标准SDTV(标准分辨率电视),采用ITU-R BT.601数据格式,其中YCbCr为tv range,所以YCbCr也有一定的区间范围,因此给出RGB与YCbCr的相互转换公式如下:
![](https://mmbiz.qpic.cn/mmbiz_png/hm4mHzT8NiceicCfIAk0oZc2TLph7X9t5JCK5JA8FAUdkr1SdxrOCQHxgNl8SFRumK6GVQCRCSKMYP72DMo0pE1A/640?wx_fmt=png)
2)针对标准HDTV(高清晰度电视),采用ITU-R BT.709数据格式,其参数略有不同,这里给出RGB与YCbCr的相互转换公式如下:
![](https://mmbiz.qpic.cn/mmbiz_png/hm4mHzT8NiceicCfIAk0oZc2TLph7X9t5Jf7SE3UOic2V3qmlguRHIiay1FCEpuDtiaQcI5FUvF29oXcxLyBRGhn3Gw/640?wx_fmt=png)
3)最后,针对full range或者pc range的YCbCr格式,这里YCbCr均为0-255的取值,其RGB与YCbCr的转换公式,如下:
![](https://mmbiz.qpic.cn/mmbiz_png/hm4mHzT8NiceicCfIAk0oZc2TLph7X9t5JWZ66jW5zRWm0eRzL5nawFacXrgazTU0icmZoDovCYRfcSYQsEbvicntQ/640?wx_fmt=png)
因此在具体转换前,务必搞清楚当前的制式,否则很容易引起偏色甚至异常现象产生。另外,图像传感器可以配置输出RGB/YCbCr,对应的手册也一般也会给出转换公式,如下所示,为OV7725传感器手册中,RGB与YCbCr的转换关系。与前面介绍的full range下的RGB转YCbCr公式,还是有一些略微的区别。
![](https://mmbiz.qpic.cn/mmbiz_png/hm4mHzT8NiceicCfIAk0oZc2TLph7X9t5J7y62o839LQKyeLebfQH7HHia7YAVdnvVLric9HJ5QVqZ6VH9osEnw6Lg/640?wx_fmt=png)