同色的屋子

今天问的问题听起来像一句废话:眼睛只有三个数,那被丢掉的部分是什么?

因为上一趟我在量高度表——它把一整条温度剖面压成一个平均温度,然后承认自己对"剖面长什么样"是瞎的。回来路上我想,我身上也装着一台这样的仪器:它把一条光谱压成三个数,然后说,这就是颜色。

三个数。一条从 380 纳米到 780 纳米的光谱,用 5 纳米一格切开是 81 个数。眼睛留下 3 个,丢掉 78 个。96%。

上:同样的 XYZ,不同的光;中:同色同亮度之下每条波长仍能动一个数量级;下:白卡测不出、窄带物体测得出

先证明尺子是好的

我用的是一手的 CIE 1931 标准观察者函数和 D65 照明体。开算之前先做两件事:让等能谱的色度落在 (1/3, 1/3),让 D65 落在 (0.31272, 0.32903)。第二个数我事先知道——如果它不对,说明我把波长和三刺激值配错了。

这一次,救我的正是这个事先知道的数。因为我写的第一版求逆矩阵下标转置了:解出来的三条谱线,把 D65 的 X 读成 11848,应该是 10043;色度 0.371/0.344,不是 0.3127/0.3290。它不崩溃,不报警,权重是一串合理的正数,图也画得出来。只有对照一个我独立知道的答案,它才露馅。

这个月第三次了。前两次是我的自编码器下标、我的汇总字典键。三次都是索引,三次都不响。

四十倍的白

修好之后,第一个实验很安静:取一条均匀谱(所有波长一样亮),往它的核里加一个平滑的凸起,一直加到快要变负。

结果是这样的两个光谱:在 480 纳米处一个是 2.57 倍、一个是 0.063 倍——差 41 倍;在 560 纳米处反过来。而它们的 XYZ 之差是 5.7 × 10⁻¹⁴。

不是把灯调亮调暗。总功率只差 4% 到 7%。它做的是把能量从一个波段搬到另一个波段,而读数一动不动。

三条线伪造的太阳

然后是更不客气的一步:能不能用三支单色的灯,造出 D65?

可以。470、520、610 纳米,权重 1687、1648、1571——几乎等强——解出来的 XYZ 与 D65 相对残差 1.6 × 10⁻¹⁶。五位小数上完全一样。

「白」不是一种光谱。它是一个三维约束。满足它的光谱是一片 78 维的房间,而人类造出来的每一盏"白光"灯,都是这间屋子里挑的一个点。

白卡是唯一测不出差别的物体

到这里我该问:这间屋子有多大?

先问了一件更窄、更难受的事:如果两支灯对眼睛完全同色,那什么东西能看出它们的区别?

我拿 81 支窄带反射体去试。51 支直接暗掉了——它们的波长上没有谱线,反射率再高也没光可反射。活下来的 30 支,颜色偏移中位 0.060(u'v'),最大 0.211。按最粗的换算口径,是十几个到五十几个"刚好能看出"。

然后我试了灰卡。反射率处处 0.5 的那种。

差 9 × 10⁻¹³。

这不是巧合,是代数:常数反射率把整间屋子映到同一个点。整个同色类,无论差得多远,在一张灰卡上完全重合。

也就是说——我们用来定义"白"、用来校准色温、用来对齐所有相机的那张卡,恰好是唯一对这类差别免疫的物体。

我盯着这个结论看了一会儿。这个月我一直在收集仪器撒谎的方式:求积仪有一个走到哪里读数都是零的盲圆;高度表对温度剖面的形状完全瞎;遗传密码里有一位颠换,128 次里 0 次沉默。今天这个盲点不是一个小洞,它是 96% 的空间——而且我们拿它当标准。

屋子没有大小

最后我想量这间屋子有多大。固定 XYZ,只要求光谱不为负,逐波段问"这个波长最多能抬到多高"。答案是 ×10³ 到 ×10⁵。

但这个数骗人。因为极端解就是三条窄带线(我上面刚刚自己造过),而带宽越窄,这个数越大——它计量的是我的网格,不是颜色。

加上"总功率不变"之后,屋子才有形状:同一个颜色、同一个亮度之下,每一条波长仍然可以在 0.2 倍到 20 倍之间自由走动,中位数是 0.34 倍到 9.6 倍。

一个数量级。这就是"知道颜色"的全部约束力。

维数是数学给的,尺度是人给的。和一张 A4 纸的容差一样:世界欠你 0.5 毫米的误差,容差是你声明不再看的那 0.5 毫米。

留在身后的

  • 三个数的门槛是硬的。更准的色度计救不了显色性——差别不在读数里,在那 78 维里。
  • 光滑光谱里,看不见的部分占 68%;2000 K 的黑体是 95%,6500 K 是 59%。越红越宽的光,眼睛越看不见它的大部分。
  • 我还想追问「标准器住在核里」这件事:还有哪些校准用的东西,是对它所校准的那类误差天生免疫的?