关于颜色和颜色空间

The world is moving so fast that the person who says it can't be done is generally interrupted by someone doing it. — Elbert Hubbard

我们如何感知颜色

光具有波粒二象性,这个初中的时候就学过。光首先是一种波,光源会发射不同波长的电磁波,不同波长的电磁波具有不同的能量,可以通过 E=hc/λ 来计算电磁波的能量。可见波长λ越高,能量越低;波长越低,能量越高。另外因为粒子的属性,所以光也有反射、漫反射等其他的特性。

我们生活的环境中、宇宙中,充满了电磁波,电磁辐射按波长分,从长到短分为:

•无线电波(radio waves,波长约在1米 – 100公里间,无线电广播、电视信号)

•微波(micro waves,波长约在1毫米 – 1米,主要用在通讯、雷达、家用微波炉等)

•红外线(infrared,波长约在700纳米 – 1毫米间,主要用在温感,跟踪,通信,气象等多种场景)

•可见光谱(visible spectrum,波长约在400纳米 – 700纳米间,是人眼可感知到光谱范围)

•紫外线(ultraviolet,波长约在10纳米 – 400纳米间,医学照片,消毒杀菌等)

•X射线(X-rays,波长约在0.01纳米 – 10纳米间,用于医学透视,放疗等场景,人体长时间或大剂量暴露在X射线下,容易对人体造成伤害)

•伽马射线(gamma rays,波长约在0.01纳米以下,用于货物检测等场景,人体长时间或大剂量暴露在伽马射线下,会导致罹患癌症,也因为对癌细胞也有伤害作用,有时也被用来进行放疗)

它们的光谱分布图如下图所示:

可见光部分电磁波通过视觉神经传递给大脑后,由大脑翻译成为不同颜色。可以看得出,人真正可以感知到的电磁波范围是极其窄的。假设人可以看到更宽波长的电磁波,你所看到的世界将会完全是另外一个样子了。

地球是个神奇的存在,宇宙中大量的高能电磁波,对人体伤害极大,绝大部分被大气层吸收了,就不需要担心有害射线对整体人体的伤害,我们之所以生活在这个蓝色的星球上,的确是有很多奇妙的条件组合才成为可能的。

颜色

视频技术的本质是驱动光源设备呈现某种视觉效果,人眼如何认知颜色是最基础知识。

视网膜中的感光细胞一共有三种:视杆(rods)和视锥(cones)是传统意义上最重要的两种感光细胞,它们负责对光线和颜色进行感知。在1990年前后,又一种新的感光细胞被发现,名为固有光敏性视网膜神经节细胞(intrinsically photosensitive retinal ganglion cells)。

•视杆(rods)用来感知消色差光,对夜间的视力贡献大。人有大约1.2亿个rods细胞,它们非常非常敏感,有一个光子就可以形成信号。•视锥(cones)用来感知彩色光,对白天的视力贡献大,人有大约600万个cones细胞(远少于rod cells),需要非常强的光才能形成信号。•固有光敏性视网膜神经节细胞(ipRGC)是最新发现的新的感光细胞。它在视杆和视锥的前面,量比较小。一些人可以通过它感知到蓝光,一些视觉障碍的人可以用它感知到亮暗,研究也发现,因为它与人的生物钟调整有一定关系(对环境光潜意识的感知)。

这些生物学结果都很重要,视杆和视锥的特性直接影响了视频压缩对YUV颜色空间的设计,而新发现的ipRGC,也可能还有除了很多科学家在应用它的原理帮助视觉障碍人恢复部分视力能力之外,也可能有一些新的应用模式将被发现。大家也不妨查查信息,想想看。

所以颜色的感知(chromatic light)基本只取决于cones,而白光的感知(achromatic light),取决于rods。所以在暗光情况下,能看见物体,但是不能感知颜色,也就是这个原因(rods在工作,cones不在工作)。

继续深入的研究发现,视锥细胞一共有三种,一种对短波敏感,叫S-cones(也叫Blue-cones,因为对应波长的光是蓝色),一种对中波敏感,叫M-cones(也叫Green-cones,因为对应波长的光是绿色),一种对长波敏感,叫L-cones(也叫Red-cones,因为对应波长的光是红色)。

这个也是三基色选这三个颜色的来历,就是这三种颜色对应了眼睛的三种不同的感光细胞的敏感峰值。

另外如果你采样视网膜的一个部分,你会发现三种感光细胞的分布也不同:

图中红色代表L-cones(Red-cones),绿色代表M-cones(Green-cones),蓝色代表S-cones(Blue-cones),可以明显看出S-cones明显比L-cones和M-cones少,整个视网膜上L-cones加M-cones大根是S-cones数量的100倍。

另外可以看到,L-cones和M-cones是均匀分布的,S-cones是不均匀分布的。密度也相对较低。这个跟进化、生理学是有关的。医学上发现S视蛋白是在胎儿11周的时候就可以找到的,M/L视蛋白是在13周的时候才可以找到的。所以在上面的三种细胞感光范围与有不同,S与L和M的区间间隔也明显要更大一些,但对光敏感度影响不是决定性的。

光源

光源分为两类,因为它们的电磁波生成原理不同,在物理上也自然分为不同的光合成方式。

1.第一种叫照明光源,比如太阳,电灯,显示器,手电筒等。因为电磁波本身就是由它所发射而感知,所以人眼看到时,是由它发射电磁波的合成结果决定。因此,人感知到的颜色符合加法原则。

2.一种叫反射光源,比如油漆、打印使用的墨,达闻西的手电筒等。因为它通过反射入射电磁波让人感知,光线照到反射面时,部分光线被吸收,不被吸收的部分,被反射至人眼。因此,人感知到的颜色符合减法原则。

颜色空间

知道了颜色是什么,它是如何被人眼感知的,接下来就可以寻找一些数据模型来描述颜色,以便进行颜色的描述、处理、以及其他图像视频的应用。

颜色空间的分类与定义

目前颜色空间已有上百种不同的设计,但是本质上一共有5种不同的颜色空间模型,然后衍生出其他所有的颜色空间

•CIE

以CIE 1931 XYZ为主(也就是常说的CIE 1931),它被用来衡量人眼可感知到的所有颜色,并被作为其他所有颜色空间的生成基础。从色度图也可以看到这一点,周围一圈即是彩虹的颜色。因红和紫色没有颜色过渡,从闭合的角度上,使用直线连接。它是各种颜色的完整电磁波对应关系绘制结果,因此它最具有理论参考价值的模型。它的绘制方法可以参考CIE Coordinate Calculator[1]

其中色度图范围外的部分都是无色的,表示不存在的颜色,有很多后面设计的颜色空间为了尽可能大地覆盖CIE 1931颜色空间色度图范围,部分使用了这些不存在颜色空间(但因无法物理表达这些颜色,不能被人眼识别,或只能被裁剪到近邻颜色)

CIE 1931是人眼可见颜色的物理表达,表现力最强,但是因为使用该颜色空间采集和显示的成本非常非常高,很多效果目前仍然很难实现。而大量的浮点运算,导致处理的计算压力也非常大,很难商用。同时因为细节度极高,噪点也会非常多。所以是非常理想的模型,但是很适合延展或是评估其他实用颜色空间。

• RGB

如上文所说,RGB本身是一种颜色模型,对应到三种不同视锥的感光细胞敏感峰值颜色,组成了三基色。真实的颜色空间有sRGB(standard RGB),Adobe RGB等。

显示设备无法呈现所有的可见颜色,所以只能包含CIE 1931的一个部分。如sRGB能表达的颜色范围是:

而Adobe RGB可见范围就大很多,另外保持了跟CMYK的强一致性,以确保颜色可以被正常的打印。

ProPhoto RGB是柯达提出的颜色空间,为了最大程度复用真实世界颜色,所以使用了非常大的色域,可以覆盖90%以上的CIE 1931颜色空间色彩。

•YUV

Luma + Chroma模型,用一个通道存放Luminance分量(以G通道为基础),R、B与Luma的差值作为两个Chrominance进行表达。可以参考前文对rods和cones的细胞的描述,因为两个颜色分量对人眼来说重要性相对亮度分量没那么重要,所以一般会对UV分量进行下采样处理,这样只需要1/4的空间就可以表示原图,实现数据压缩的效果,因此被视频编码、图像编码所广泛应用。

YUV按不同的制式,色度图也有一定的差异。

•HSL/HSV

Hue + Saturation + Lightness / Value,在图像的颜色、视频内容处理中应用非常广泛,因为它的表达更接近于艺术家对于颜色控制的要求,可以很容易地达成他们的想法和目标。

HSL/HSV与RGB空间是对等的,所以色度图一致,HSV对颜色的控制力是非常直观的,转换关系可以描述为圆柱形。

•CMYK

Cyan + Magenta + Yellow + Key(black),主要用于打印,在一个白色背景下(以白色为空白),通过反射光减的方式,得到所有其他颜色。其色度图如下所示:

颜色空间转换

从任一颜色空间A转向另一颜色空间B的方式被称为颜色空间转换,经典的应用场景有:

•从解码的图像或视频(YUV space)向显示器等设备进行渲染展示(RGB space)•将一个图像文件(RGB space)提交给打印机进行打印时(CMYK space)•将一个图像文件(RGB space)交给艺术家进行二次创作时(HSV space)

等等,非常多场景。

颜色空间的算法本身不复杂,很容易搜索出来,但是因为转换是每个像素的高精度计算,对视频来讲,一秒30秒,2k的画面的话,可以知道计算压力有多大。所有的开源库都在尽所有芯片设计能力加速这些计算的部分。这块话题就非常数字化,我们找个时间单独说这些开源库的实现技巧。

一些常用的颜色空间转换的库,比如:

•ffmpeg[2],万能媒体处理开源库,从任一所支持的空间转向另一空间•libyuv[3],Google出品的高性能YUV缩放、转换开源库,只支持YUV到各空间的互转,面向媒体数据I/O的应用•基于OpenGL ES和DirectX的shader运算转换框架,很多GPU框架的项目都在用,可以参考GPUImage[4],其他也大同小异。

后面我们找一个时间,具体讲一下里面的门道。

一些冷知识

• 据实验,有些孩子们可以感知到最低310纳米波长的电磁波光线,所以老话说孩子们能看到大人看不到的东西,其实也不能说全是迷信。

•1938年的时候,Georges Valensi就提出了使用G通道存储亮度数据,B和R的差分分量存储在另外两个通道中来传输彩色信号的方案。这样即可以兼容黑白电视信号,同时信号也可以复用在新的彩色电视中。这个方案当时一直没有被广泛使用。Valensi后来参加了CCIF的远程信号传输项目,这个组织后来变成了CCITT,最后成为了我们熟知的ITU。也就是在这里,Recommendation 709(52年后的1990年)这样重要的提案被提出了,也就定义了把G通道数据完成存储在Y通道中的方案,演进为现在通用的YCbCr和YUV方案。老爷子活了近90岁,硬是把事做成了,真心看得远,加入正确的团队,坚持得久,事竟成。

References

[1] CIE Coordinate Calculator: https://ww2.mathworks.cn/matlabcentral/fileexchange/29620-cie-coordinate-calculator[2] ffmpeg: https://www.ffmpeg.org/[3] libyuv: https://github.com/lemenkov/libyuv[4] GPUImage: https://github.com/BradLarson/GPUImage

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据