某种波长的光,其颜色能不能用准确的 RGB 值表示?
先强调一下,楼上很多人说的「单色光和混合光」问题,和题主的问题关系不大,题主只是问波长能不能 map 到 RGB 值,又没说这个 map 必须是 bijective 的⋯⋯
=====
问题提到了「某种波长的光」,所以我在这里假设题主问的是单色光。
这个问题有两种解读方式,一种是「单色光的颜色能不能用三个数来 parametrize」,回答是当然可以,单色光的颜色可以用一个数来 parametrize,那个数叫波长⋯⋯⋯⋯⋯⋯⋯⋯ 所以三个数显然是可以的,把 R 设为波长,G = B = 0 就可以了⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯
另一种解读是「单色光的颜色不能不 map 到 RGB 三个数,这样在某种显示设备上你给它这个 RGB 数,它就能显示出和这个单色光一模一样的颜色」。这个问题的答案依然是当然可以。
而且这不是一个生物学问题,也不是个物理学问题,只是个数学问题。
波长到颜色的对应,第一步是确定一组 color matching function。当然这组函数是实验确定的,具体测量是生物学和物理学问题,但是当这组函数确定以后,就和生物和物理没有任何关系了。常用的一组函数是 CIE standard observer。
确定 color matching function 以后下一步是以这些函数为基张一个线性矢量空间,并且定义内积,这个空间叫 XYZ 空间。内积是一个数,所以这步完成以后所有波长分布的光都会对应三个数(当然给定三个数并不能得出唯一的波长分布,然而这个问题无关)。题主问的是单色光,如果你把单色光在 XYZ 空间里对应的点找出来,这个点集叫 chromaticity curve。
下一步是在 XYZ 空间里找三个点(矢量),分别定义为 R, G, B,并以这三个矢量为基张出 RGB 空间。这个 RGB 空间是 XYZ 空间的子集。这三个矢量基本上是随意的,比较常用的标准是 Rec.709(sRGB 和 Rec.709 共用基矢)。RGB 空间确定以后和 XYZ 空间就差一个线性变换,所以那个 chromaticity curve 完全可以翻译到 RGB 空间里来(当然前提是 RGB 空间要够大,注意 R=X, G=Y, B=Z 也是一种可用的定义)。
所以题主的问题到此已经答完了。只要 RGB 空间够大,chromaticity curve 可以完整地包含进来,那就可以用 RGB 值表示,如果不能完整包含,那么包含进来的那些波长可以用 RGB 值表示。
具体解释和一些公式我写到这个回答里了:匿名用户:我们知道光的颜色由光的频率决定,为什么光的三原色可以合成任意颜色的光?
但是一个引申问题是,某种波长的光,能不能用平常网页上可用的 RGB 值表示?这个问题的答案是不行。原因是平常网页上默认使用的空间是 sRGB,这是个很小的空间,不能完整包含 chromaticity curve(实际上完全没有包含⋯⋯)。
另一个引申问题是,在工业上有没有一种实际用到的 RGB 空间是足够大的,至少包含了 chromaticity curve 的一部分?答案是有(之前我写的没有,后来意识到其实是有的),比如 ProPhoto RGB。

评论 1
问一下楼主,如果给定一个颜色,如何求出该颜色对应的所有光谱分布,也就是求出同色异谱的所有可能,光源就是D65,观察者是人眼(个人认为这是一个纯数学问题,但是无从下手)谢谢