spectrum -> XYZ -> RGB 中为何存在负值

今天和导师小吵一架,讨论关于为啥我画的红色/绿色/蓝色的spectrum强度曲线里面有负值。查了一些资料(其实就是wiki),大概搞明白了。

首先RGB是人为定义的值,不等于人眼三种视锥细胞能感受到的强度(LMS space),也不等于某个对应波长下光的颜色(spectrum space)。

The human eye with normal vision has three kinds of cone cells that sense light, having peaks of spectral sensitivity in short ("S", 420 nm – 440 nm), medium ("M", 530 nm – 540 nm), and long ("L", 560 nm – 580 nm) wavelengths.这里定义了LMS space,画spectrum图对应:

image

LMS空间的值并不都是有意义的,因为一个波长的光往往会激发2-3种视锥细胞(从图中也可以看出来)。一些LMS是并不对应物理上的任何光波的,在现实世界没有这种颜色,比如没有单独激发M视锥但是L和S视锥都不被激发的颜色。(Certain tristimulus values are thus physically impossible: e.g. LMS tristimulus values that are non-zero for the M component and zero for both the L and S components.)

XYZ空间包含了LMS空间中有物理意义的部分,下图有颜色的部分都对应实际存在的,人眼能够感知到的,LMS空间中的点。

image

However,我们可以发现这个空间是异形的,也就是说不能用某三种颜色的线性组合来表示人眼能看到的所有颜色。(Furthermore pure spectral colors would, in any normal trichromatic additive color space, e.g., the RGB color spaces, imply negative values for at least one of the three primaries because the chromaticity would be outside the color triangle defined by the primary colors.)这和我们的很多知识是相违背的,比如我们认为所有颜色都可以表达为RGB值的线性组合。这是错误的,只是为了相机sensor/显示器显示/彩色打印之类的应用场景的方便,其实人眼能感知的范围被缩小了。

但是我们仍然会有将spectrum(这个是真的物理的)转换到RGB空间(这是人为定义的,注意它并不等于三视锥能感知的范围)的需求。因此,对于spectrum上sample的某一个波长的激光,要去找到对应RGB分量。为了做这个事情,科学家做了人肉实验,给标准的红绿蓝颜色,和这个激光的颜色,让人去混合红绿蓝来匹配激光颜色,记录红绿蓝强度。

此时问题是,对于有些激光,人眼感知到的颜色是不能被红绿蓝线性组合得到的。但是,比如这个激光λ1,加上红色激光λ2(假设对应RGB值为(20,0,0)),就可以被红绿蓝表示了。假设表示为(0,100,100),人眼下看起来λ1和λ2两种激光的混合,颜色就和100份蓝光+100份绿光相同。那么很自然地,我们可以认为λ1对应的RGB值是(-20,100,100),这就是为什么出现了负值。

因此,对于真正的视锥细胞感知的强度LMS,是有物理意义的,也是强度非负的;对于spectrum空间,是每种波长的光强度,也是有物理意义的,非负的。但是RGB空间,本身是人为定义的,就是有可能出现负的值。这是合理的。最终曲线如下:

image

posted @ 2024-12-23 19:34  zyx_45889  阅读(149)  评论(0)    收藏  举报