• home > theory > multimedia > CG-CV-IP >

    色彩空间RGB/CMYK/HSL/HSB/HSV/Lab/YUV基础理论及转换方法:RGB与YUV

    Author:[email protected] Date:

    人能够感知到的色彩是一个三维线性空间的子集,我们将其称为色彩空间。从光学三原色到印刷三间色,到符合认为更友好的HSL HSV色彩模型。到CIE的Lab色彩模型。慢慢讲解

    之前做个设计,现在从事IT,脑子里面关于RGB,RGBA,CMY,CMYK,YUV,但是具体理论还是不扎实。若干年前之前写过《水煮RGB与CMYK色彩模型—色彩与光学相关物理理论浅叙》《三色视者与四色视者身后的理论基础:色彩原理

    光学三原色与印刷三间色

    光学的三原色: 红(Red)、绿(Green)、蓝(Blue) (RGB)。

    印刷的三原色: 青(Cyan)、品红(Magenta)、黄(Yellow) (CMYK)

    印刷色是光照射在印刷物上, 然后折射到人眼的光的合成,所以印刷色会比光学暗淡,因为印刷色是经过印刷物过滤过光合成的,自然会比较相对暗淡。

    C(100)  +M(100) +Y(100) = 黑色(100,100,100)

    可见黑色就是青色、品与黄色之和,但是这三种颜色混成的黑色不够纯,所以印刷学就引进了K(Black)黑色,因为B已经被Blue占用,所以黑色就只好用引文字母黑色的最后一个字母K,所以:

    C(100)  +M(100) +Y(100) + K(100) 等价于 C(0)  +M(0) + Y(0) + K(100) = 黑色

    光学三原色如何得到白色, 配色如下:

    R(0) + G(0) + B(0)+A(255) =  C(0)  +M(0) + Y(0) + K(100) = 黑色

    联想下,是不是可见黑色就是没有颜色(0,0,0)?

    我们显示屏一般采用RGB,印刷采用CMY。RGB/CMY色彩模型是通过不同量的(红/绿/蓝)||(青/品红/黄)来描述一个颜色的,对人类来说很不直观,难以理解。他们对机器很友好的色彩模式,但并不够人性化,难以直观理解,因为我们对色彩的认识往往是:什么颜色?鲜艳不鲜艳?亮还是暗?

    三原色与三间色组合色相环图示

    基于RGB改进的HSL/HSV色彩模型

    HSL 模式和HSB(HSV) 都是基于 RGB 的,是作为一个更方便友好的方法创建出来的。HSB和HSV是是一样的,只是叫法不一样而已

    • HSL:色相H(Hue) ,饱和度S(Saturation),亮度L(Lightness)

    • HSB:色相H(Hue) ,饱和度S(Saturation),明度B(Brightness)

    色相H(Hue)控制颜色种类,取值0-360°的圆心角。需要记住色相环上的六大主色:红黄绿青蓝洋红(即RGB夹CMY呈60°分布)用作基本参照

    饱和度S(Saturation)控制颜色的纯度。取值0-100%。数值越大,颜色中的灰色越少,颜色越鲜艳,呈现一种从灰度到纯色的变化

    亮度L(Lightness)明度B(Brightness)控制色彩的明暗变化,取值0-100%。

    HSB与HSB其中的S与L有着不同的表述。这里暂且忽略,推荐阅读:色彩空间中的 HSL、HSV、HSB 有什么区别- AK23的回答 - 知乎

    YUV与YCbCr

    无论是电影还是电视刚刚出来的时候都是黑白模式。从电视台从黑白过度到彩色,但是又要兼容原来黑白模式,不得已推出了YUV

    YUV是一种颜色编码方法。常使用在各个视频处理组件中。 YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。

    • Y:亮度信号,灰阶值。取值:0.0 ~ 1.0

    • U:色差信号R-Y(红色-亮度)。取值:-0.5 ~ 0.5;

    • V:色差信号B-Y(蓝色-亮度)。取值:-0.5 ~ 0.5;

    这时候也许你会问“咦,G(绿色)哪去了”,其实两种颜色加亮度也能通过算法大致表达出原本的颜色(果然偷工减料),所以就算是融合进R 和B 里了

    行业中处理的视频格式基本是YUV信号,而不是RGB,所以要了解视频格式的基础需了解YUV。

    现在的YUV是通常用于计算机领域用来表示使用YCbCr编码的文件。所以可以粗浅地视YUV为YCbCr。如Y'UV, YPbPr

    YUV的优点

    在最近十年中,视频工程师发现,眼睛对于亮和暗的分辨要比对颜色的分辨更精细一些,也就是说,人眼对色度的敏感程度要低于对亮度的敏感程度。工程师认为,在我们的视频存储中,没有必要存储全部颜色信号。我们可以把更多带宽留给黑—白信号(被称作“亮度”),将稍少的带宽留给彩色信号(被称作“色度”)

    YUV解决彩色电视机与黑白电视机的兼容问题

    黑白视频只有Y(Luma,Luminance)视频,也就是灰阶值。到了彩色电视规格的制定,是以YUV/YIQ的格式来处理彩色电视图像,把UV视作表示彩度的C(Chrominance或Chroma),如果忽略C信号,那么剩下的Y(Luma)信号就跟之前的黑白电视频号相同。我们常用的JPG格式,采用的YUV。

    YUV抗干扰性强

    采用YUV 色彩空间更重要在于它的亮度信号Y 和色度信号U、V 是分离的,这样分开的。好处就是不但可以避免相互干扰,还可以降低色度的采样率而不会对图像质量影响太大。如果U、V 为零,就没有颜色,变成黑白电视了。当然,Y 也是一个重要参数,其实平时我们看一个颜色深浅是很不一样的,而深浅取决于亮度Y,Y

    YUV最大的优点在于只需占用极少的带宽

    RGB色彩模式在输出时需要3个独立的图像信号同时传输,带宽占用较高。正常的RGB24是由24位即3个字节来描述一个像素,R、G、B各8位。而实际使用中为了减少图像数据的尺寸,如视频领域,对R、G、B所使用的位数进行的缩减,如你所说的RGB565和RGB555。

    如RGB565彩色模式, 一个像素占两个字节, 其中:

    • 低字节的前5位用来表示B(BLUE)

    • 低字节的后三位+高字节的前三位用来表示G(Green)

    • 高字节的后5位用来表示R(RED)

    YUV采样与压缩


    为什么YUV:2:0 需要的带宽只是YCbCr4:4:4的二分一?因为,他们在UV上可以减少采样。

    • YUV 4:4:4采样,每一个Y对应一组UV分量。 

    • YUV 4:2:2采样,每两个Y共用一组UV分量。 

    • YUV 4:2:0采样,每四个Y共用一组UV分量。

    色彩空间转换

    一般两个色彩空间,找一个变换矩阵,可以快速转换。

    rbg与xyz色彩空间矩阵变换

    YUV转为RGB

    Lab颜色模型

    Lab颜色模型是由国际照明委员会(CIE:International Commission on illumination)制定的一种色彩模式。

    • L*代表明度,取值0~100

    • a*代表从绿色到红色的分量 ,取值-128~127

    • b*代表从蓝色到黄色的分量,取值-128~127

    这样规定是根据人类的视觉原理,灵长类动物的视觉都有两条通道:红绿通道和蓝黄通道,大多数动物最多只有一条通道,如果有人缺失其中一条,就是我们所说的色盲。

    其实,我们生活中所说的颜色和光谱中可见光的颜色并不是严格对等的。实际上,存在两种颜色的定义

    • 自然界真实存在的颜色:严格对应波长,实际上所谓的不同的颜色就是可见光电磁波的不同波长(或者能量不同)的光子。比如波长为550nm的光子、波长为700 nm的光子...

    • 人眼感知的颜色:人眼对整个可见光谱的感知。因为人眼视网膜上,主要负责感知色彩的视锥细胞对不同波长的光子的感知并不相同,存在一个相应的范围

    而人眼对不同波长的感知能力可以用下图中的白色曲线来表示。白线对应的值越高,表示人眼对此波段的光子的感知越灵敏。人眼把S那条线感受到的光子都认知为蓝色、把M那天线的认知为绿色、把L那天线对应的认知为红色。

    实际上,上述的三种颜色:蓝、绿和红色(RGB)正是我们所知道的三原色。所以,事实上,你只能看到三种颜色:蓝绿红!等等……事实不是这样啊!我们的世界明明丰富多次啊??你怎么在这里瞎扯?其实,你看到的多种多样的颜色是这三种颜色组合在一起的结果。这三种颜色好比一个三维空间里的三个坐标,你把他们不同程度的组合起来,就可以形成各种各样的颜色。实际上,他们形成了一个3D的色彩空间,如下图,空间中每一个点都代表了一种颜色。

    所以你看到的颜色其实就是人眼在对蓝绿红这三种光子的测量,然后线性的叠加而已!其实我们的RGB显示器就是运用了这个原理,显示出不同的色彩。所以,很多颜色并不是真正的一个颜色而已,它代表的是这个物体发出的光中,蓝绿红这三种光的相对强度的组合!!这些美丽的颜色中很大一部分其实只是你的脑补而已…… [不过,因为人眼视锥细胞的响应也存在饱和,也就是说蓝、绿和红不可能无限的亮,因此,人类的感知只是这个三维空间里的一个有限区域。这也是CIE定义出他们最有名的CIE色表的来源。因为人类对色彩的感知是有限的,且我们实际上对实际的光谱更感兴趣,所以,根据人眼对色彩的响应曲线,我们可以把上面的三维空间变换到二维(如下图)

    而这二维的平面涵盖了人眼能看到的所有颜色(注意,实际上上述的三维色彩空间里有很大一部分是人眼无法识别的颜色,因为人眼视锥细胞的感光能力是有限的!),于是就形成了下面的CIE图,此图是1976年的修改标准,该图最早由1931年提出。


    而,通过数学运算,不难算出真实光谱,比如450nm的光应该什么颜色的。你只需要把450nm处三种颜色的视锥细胞的响应叠加起来就行了。通过这样的方法,你就可以计算出一条曲线,它可以近似代表自然界中真实的色彩。此外,你还可以计算出色温曲线。如果你还记得黑体这个概念的话,不同温度会给出不同的能谱分布,如下图,不同的能谱分布中,蓝、绿和红色的相对强度不同。

    那么同样通过数学的运算,你可以计算出不同温度黑体在人眼中所反映出的“颜色”。就是图中间的那条曲线。太阳的温度是~6000K,于是我们可以对应出来,太阳是白色(偏一点点黄)。]然而,还需要提到的是,上面说的是物体发出的光,比如太阳(黄白色),还有你的显示器。那么绿叶的颜色又是怎么回事?白纸呢?白种人为什么那么白?黑人为什么那么黑?因为他们不发光。所以,其实他们的颜色只是他们反射的光中蓝绿红这三种光的相对强度的组合!!因此,对于反光的物体来说,光源的颜色覆盖很重要。这也是为什么我们使用日光灯或者白光灯的原因。试想一下,如果你用绿光灯,你还能看到丰富多彩的衣服和图画吗?值得一提的是,汉语里的紫色其实是一个比较模糊的概念,既可以对英语英语里的violet,也可以是purple。严格来说,violet更接近比蓝波波长更短的颜色,也就是红和绿都很少,而蓝色也很弱的情形。相当于黑中加了点蓝的感觉。而紫色则是纯粹的脑补大红+大蓝而已。不管则样,紫色并不是真实的颜色。那么violet呢?其实它也并不是真实的,我们再来看一副更精确的视锥细胞响应曲线

    或者为了更加严谨,我们来看看论文里实际的测量曲线:

    注意到了吗?实际上在比蓝光中较短的波段红色视锥细胞的响应也比较突出,大概是0.1,而蓝色大概是0.7-0.8。因此,你看到的violet也是蓝+红组合的结果。

    一句话总结,我们大致可以理解为,颜色是自然界的可见光波段的光谱在人眼中的一个线性投影。我们可以更具CIE,把人眼中看到的“颜色”,还原到自然界“真实的颜色”

    自然界中任何一点色都可以在Lab空间中表达出来,它的色彩空间比RGB空间还要大(有毛用?超过了RGB色域屏幕显示不了,超过了CMYK的色域打印不了,超过了视觉色域看都看不了!高精度下lab偶尔可以作为颜色模式的中间标尺,但是这和你一点关系都没有。这纯粹是数学公式定义的结果——色域很大纯粹是因为定义范围内有许多多余的颜色)。不过对PS用户来说:LAB最大的优势就是调色,最常用的也是调色。明度和色彩信息因为是分离的,可以允许做出更多的操作,更精准的调整。也可以通简单的调整就出做一些别的模式非常复杂的操作才能达到的效果。比如照片过暴导致高光细节丢失严重,就可以用LAB修补高光部分的色彩信息。

    这种模式是以数字化方式来描述人的视觉感应, 与设备无关,所以它弥补了RGB和CMYK模式必须依赖于设备色彩特性的不足。由于Lab的色彩空间要比RGB模式和CMYK模式的色彩空间大。


    注:Catmull和Smith在1971至1972年间提出了这个不可或缺的alpha数值,使得alpha渲染和alpha合成变得可能。提出者以alpha来命名是源于经典的线性插值方程αA + (1-α)B所用的就是这个希腊字母。PNG是一种使用RGBA的图像格式。




    参考文章:

    色彩空间表示与转换 https://zhuanlan.zhihu.com/p/24281841

    对颜色空间YUV、RGB的理解 https://blog.csdn.net/asahinokawa/article/details/80596655

    色彩模式RGB&YUV 格式分析 www.eepw.com.cn/article/282178.htm





    转载本站文章《色彩空间RGB/CMYK/HSL/HSB/HSV/Lab/YUV基础理论及转换方法:RGB与YUV》,
    请注明出处:https://www.zhoulujun.cn/html/theory/multimedia/CG-CV-IP/6112.html