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

2,133 阅读10分钟

之前做个设计,现在从事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的回答 - 知乎

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的图像格式。

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

rbg与xyz色彩空间矩阵变换

原文链接:色彩空间RGB/CMYK/HSL/HSB/HSV/Lab/YUV基础理论及转换方法:RGB与YUV - 计算机视觉与计算机图形学的图像处理所涉及的基础理论知识 - 周陆军的个人网站,原文阅读体验可能更好,文章更新只在源站进行,如有不妥之处,请留言告知,多谢

参考文章:

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