光具有波粒二象性,这个初中的时候就学过。光首先是一种波,光源会发射不同波长的电磁波,不同波长的电磁波具有不同的能量,可以通过 E=hc/λ 来计算电磁波的能量。可见波长λ越高,能量越低;波长越低,能量越高。另外因为粒子的属性,所以光也有反射、漫反射等其他的特性。
我们生活的环境中、宇宙中,充满了电磁波,电磁辐射按波长分,从长到短分为:
它们的光谱分布图如下图所示:
可见光部分电磁波通过视觉神经传递给大脑后,由大脑翻译成为不同颜色。可以看得出,人真正可以感知到的电磁波范围是极其窄的。假设人可以看到更宽波长的电磁波,你所看到的世界将会完全是另外一个样子了。
地球是个神奇的存在,宇宙中大量的高能电磁波,对人体伤害极大,绝大部分被大气层吸收了,就不需要担心有害射线对整体人体的伤害,我们之所以生活在这个蓝色的星球上,的确是有很多奇妙的条件组合才成为可能的。
视频技术的本质是驱动光源设备呈现某种视觉效果,人眼如何认知颜色是最基础知识。
视网膜中的感光细胞一共有三种:视杆(rods)和视锥(cones)是传统意义上最重要的两种感光细胞,它们负责对光线和颜色进行感知。在1990年前后,又一种新的感光细胞被发现,名为固有光敏性视网膜神经节细胞(intrinsically photosensitive retinal ganglion cells)。
这些生物学结果都很重要,视杆和视锥的特性直接影响了视频压缩对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的区间间隔也明显要更大一些,但对光敏感度影响不是决定性的。
光源分为两类,因为它们的电磁波生成原理不同,在物理上也自然分为不同的光合成方式。
知道了颜色是什么,它是如何被人眼感知的,接下来就可以寻找一些数据模型来描述颜色,以便进行颜色的描述、处理、以及其他图像视频的应用。
目前颜色空间已有上百种不同的设计,但是本质上一共有5种不同的颜色空间模型,然后衍生出其他所有的颜色空间
其中色度图范围外的部分都是无色的,表示不存在的颜色,有很多后面设计的颜色空间为了尽可能大地覆盖CIE 1931颜色空间色度图范围,部分使用了这些不存在颜色空间(但因无法物理表达这些颜色,不能被人眼识别,或只能被裁剪到近邻颜色)
CIE 1931是人眼可见颜色的物理表达,表现力最强,但是因为使用该颜色空间采集和显示的成本非常非常高,很多效果目前仍然很难实现。而大量的浮点运算,导致处理的计算压力也非常大,很难商用。同时因为细节度极高,噪点也会非常多。所以是非常理想的模型,但是很适合延展或是评估其他实用颜色空间。
而Adobe RGB可见范围就大很多,另外保持了跟CMYK的强一致性,以确保颜色可以被正常的打印。
ProPhoto RGB是柯达提出的颜色空间,为了最大程度复用真实世界颜色,所以使用了非常大的色域,可以覆盖90%以上的CIE 1931颜色空间色彩。
从任一颜色空间A转向另一颜色空间B的方式被称为颜色空间转换,经典的应用场景有:
等等,非常多场景。
颜色空间的算法本身不复杂,很容易搜索出来,但是因为转换是每个像素的高精度计算,对视频来讲,一秒30秒,2k的画面的话,可以知道计算压力有多大。所有的开源库都在尽所有芯片设计能力加速这些计算的部分。这块话题就非常数字化,我们找个时间单独说这些开源库的实现技巧。
一些常用的颜色空间转换的库,比如:
后面我们找一个时间,具体讲一下里面的门道。