光和颜色

从光到颜色

光波的本质就是电磁波(electromagnetic),由波长(wavelength)和强度(intensity)两部分构成。其中,intensity用来度量电流强度,而不同的波长呈现不同的颜色。我们也可以用频率(frequency)来描述波长,因为wavelength*frequency=光速。

而光则是由一系列强度各不相同的光波的组合,如下图,依次为白炽灯,白日光,汞灯,低高压钠灯以及那个什么金属灯所对应的波长和强度的映射关系。这样,我们就有了一个强度和光波之间的函数,我们记作f(v)

当然,多数情况下,我们所看到的颜色并不是光本身的颜色,而是光打在物体上的效果,这就是我们常见的光的反射和折射,而物体对应不同的材质,会吸收不同的光波,而吸收不了的就反射,因此,不同的材质会有一个不同的反射函数,我们记作g(v),而最终的结果就是两者之间的相互作用(乘法),示意如下:

至此,我们就可以理解光和颜色之间的关系:在可见光的范围内,不同的波长和强度的映射函数对应一种颜色。

感光器

在了解了光和颜色的关系后,我们先关心一下我们的眼睛是如何看到光和颜色的。这要归功于两类Cell:Cone & Rod. 前者可以在光线充足的情况下感受到R,G,B三种光谱,分别对应可见光范围内的长波(Large),中波(Medium)和短波(Short),后者在光线较弱的环境下感知强度,这也是夜晚我们能分别明暗但无法辨识颜色的原因。

这里要强调一下,理论上,准确的颜色对应是frequency-intensity函数的积分,但我们的眼睛只能感受到SML三种波段,假如把这三个分量作为3D空间的三个轴,我们就可以建立一个SML-Color的映射关系。第二,基于这个映射关系,存在一种可能,不同的SML分量,可能会产生相同的Color,这就产生了很多可能,材质上微妙的不同,则会产生特别的颜色,但也可能用其他的材质模拟这个颜色,也就是真钞和假钞。当然,还有一种无法分辨颜色的可能,如下图,是色盲示意图:

正是因为人眼的这种构造,我们制作的感光器,在原理上和眼睛并无区别,如下是CCD感光器的示意图:

这里有一个有意思的细节,感光器中更侧重于对绿色的识别,难道设计感光器的工程师是男性,所以针对这个颜色重点识别?这里,就有一个灰度的概念,当一个RGB转为灰度图时,绿色部分占了一半以上的比重(58.7%),而眼球中有六百万个ConeCell,1亿个Rod Cell,换句话说,人眼对光的Intensity,也就是亮度更敏感,而绿色最能表示其变化。

另外一个有意思的颜色是蓝色,最近在任正非的报道里,老人家说了一句“尼斯的海是蓝的,天是蓝的,数学家的公式为什么也是蓝的?”这里也有一个小段子,有人统计过中外古文中提到的颜色次数,发现,几乎在古文中没有提到过蓝色。基于这个统计,科学家甚至大胆的预测早期的人类是无法识别蓝色的。当然这个预测是无法证实的,但也说明一点,人眼对蓝色的噪音不敏感,不知道跟蓝色的波长最短有无关系。

当我们拍照时,无法避免噪音的产生,而如果噪音偏蓝,我们会视而不见,可见,跟任总说这个的工程师是一位图像学方面的专家。如上图对比,在光线追踪中,当我们采用blue noise和white noise采样时,不需额外操作,图像质量会有明显提升。

Color Model

当我们能够捕捉光线后,自然,我们会想到如何呈现它,这就涉及到一个模型的概念。基于感光器的原理,首先就会想到最熟悉的RGB模型。

于是,人们自然想要建立一个映射表,用三原色来模拟所有可见光的颜色,有了如下的实验,可见光中挑选一个颜色,调整三原色的值,模拟出相同的颜色:

基于该实验,我们得到了如下的映射关系,按照如下的配方,我们就可以渲染出所有的可见光。

当你心满意足的时候,是否发现一个问题,怎么红色的有负值呢?原来实验发现,不是所有的可见光都可以通过RGB合成的,于是,科学家找到了如下的解决方案来解决,这也是负值的问题:

毕竟负数在现实中并不实用,于是,人们又找到三个分量XYZ,并建立一个XYZ-RGB的映射关系(矩阵),但XYZ都大于零,于是便有了CIE-XYZ的颜色模型:

上图蓝色数字是对应的某一个可见光的波长,分别对应的是x y的分量值。这样,基于这个图,我们定义RGB三个点以及中心点(白色),就可以计算出RGB和XYZ之间的线性转换关系,如上是sRGB的定义,可见,该颜色模型并不能覆盖所有的可见光颜色。

当然,这里还有一个3D投影到2D的过程,也是为了方便使用,选取了Unit Plane,如下图不解释:

RGB模型有一个缺点,就是亮度分解到RGB三个变量,这点并不符合人眼的感光方式,人眼对明暗相比颜色要敏感。于是,便有了HSV颜色模型。

如下是HSV和RGB之间的对比,我们选择任意一个颜色,比如红色,右侧是该颜色的单色(monochromatic),我们上下滑动该控件,对比HSV和RGB的变化区别。在RGB模型中看上去差不多颜色在HSV中会发现色调相近,但亮度差别则会大一些,这更符合我们的感观,在很多视觉应用中更为有效,比如背景剔除。

SV针对每一个色调H都有一个L的色带,如果我们固定饱和度为0,则对应的是灰度色带,纯色的亮度变化,也是我们人类最擅长识别的。早期的黑白电视仅有灰度的区别,我们也是看的津津有味,我们在灰度图上增加UV两个分量,便有了彩色电视,这就是YUV颜色模型:

说到灰度图,也就是明暗的变化,从极致的暗到极致的亮之间的变化很大,不仅是人眼,任何感光元件都无法覆盖整个范围,这样,我们所感知的亮度和光的强度之间便会有一个线性关系,比如光线强度的累加就是对应颜色的强度,但人眼并不是线性关系的,如下图,这样的好处是在黑暗中更好的识别亮度的变化,因此,感光器捕捉的强度和人眼感知的强度之间就需要有一个校正,这就是gamma correction的原因之一。

前面讲到的颜色模型,都属于Additive Color Model,适用于显示器这类发光场景,但比如打印纸张对应的颜色,纸并不会发光,而是反射的原理,于是需要一种Subtractive ColorModel:

你或许会听过CMY或CMYK颜色模型,就属于这类,这时,CMY成为了三原色,引入K(黑色),大概是因为黑墨便宜吧。

个人有一个疑问,我们有时候绘制星云图时,或检测数据时不可见光时,如何确定不见光对应的颜色,是否有标准?

本文主要解释了光和颜色的关系以及感光原理,并讨论了主流的颜色模型的特点和各自的价值。

参考资料主要有:Stanford cs148 light and color, CMU cs color, Utrecht Advance Graphics & Computer Vision等

原文发布于微信公众号 - LET(LET0-0)

原文发表时间:2019-05-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券