接上篇内容,图像处理算法 | 颜色空间(一)。
还是强调一下以下内容来自于ICCV 2023的一个PPT,名称为《Understanding the in-camera rendering pipeline & the role of AI and deep learning》。到这里需要解释一下楼主为什么要把颜色空间拿出来写这么多,因为颜色是图像处理的基础。从摄影到算法,从P图到AI,都绕不开颜色,本号是专注ISP的,ISP中的白平衡、CCM、3DLUT、图像增强等模块,都是在和颜色打交道,既然绕不过去,那就只能学。
一般情况下我们学到的基础知识分两类,一种是需要推理计算的,比如乘法结合律这样的知识,一种是约定俗成的,就是某个权威机构已经定义好了,大家都按照这个标准来用。颜色空间就属于后一种知识,你知道就会用,不知道就两眼一抹黑,所以搞明白这个东西是怎么来的,将会直接影响怎么用,为了一劳永逸,花多少时间都是值得的。
上一篇CIE终于从人眼椎体的感光原理开始,一路经过光谱、色匹配函数、XYZ,最后推导出了舌形图(图13)。

图13 CIE xy chromaticity diagram
图13的舌形图在颜色空间中占据了相当重要的江湖地位,按照逻辑,接下来ICCV该讲如何使用这个色度图了吧,但是作者说了这么一句话(图14)。

图14 ICCV caution
这句英文也是作者引用的Mark D.Fairchild的,内容大致是“在大多数情况下,应该避免使用色度图,特别是当被研究的现象高度依赖于颜色的三维性质时。例如,在不同的成像设备中用色度图来显示和比较色饱和度会被误导到几乎完全错误的程度。”这位学术大咖说,色度图如果直接用于不同的显示设备中,会造成误导。这是为什么呢?又要怎么办呢?
一、当理想照进现实——白平衡的原理
在现实中,一个物体的颜色是其反射率特性和场景照明的组合。也就是说,你指定义了颜色是没用的,还得定义场景的照明条件,颜色和场景结合起来,才是摄像头捕获到的颜色。为什么人类没这个感觉呢?这里就要说到人眼的自动白平衡特性了,为了说明白平衡的原理和效果,本号已经写过一篇关于白平衡的文章了,链接贴在这里,就不在这里重复说明了。
简单来说,白平衡解决了光源到光源的映射,使得场景之间的“白色”是相同的。但是白色相同就代表其他颜色也相同了吗?这个“相同”的标准是什么呢?
二、舌形图引来的麻烦——颜色空间不唯一
目前通用的颜色空间是RGB颜色空间,如图15右下角所示,这个颜色立方体确实更容易理解。在立方体中,定义原点是(0,0,0)代表黑色,白色对应的是(255,255,255),R的坐标是(255,0,0),G的坐标是(0,255,0),B的坐标是(0,0,255)。
一切看起来都很美好,但是请问R(255,0,0)对应的是色域中的哪种红色呢,是品红?还是正红?请在色域图中圈出当前RGB所能代表的颜色范围。然后不同的厂家开始在舌形图中圈自己的颜色空间,大家各有各的想法,圈出的空间连“white point”都不在同一个位置上,那接下来要如何显示呢?为了解决这个问题,需要制定一个统一的标准,理所当然想到了CIE,但是这次还真不是CIE定了这个标准。

图15 Trouble with RGB
再强调一下那句话,颜色是被定义出来的,RGB如果脱离了指定的基光频率(R:700nm、G:546.1nm、B:435.8nm的蓝光),实际上是很难被定义的,如果两个不同的设备各有各的颜色范围,RGB就更加没有意义。
于是在1996年,微软和惠普定义了一个“标准”的RGB集,即standard RGB,简称sRGB,其RGB的坐标就是图16给出的坐标。需要注意的是,白点(0.3127,0.3290)被设置为D65光源,这意味着sRGB已经建立在6500K日光条件下,如图16所示。

图16 Standard RGB(sRGB)
图16给出了xyY域中RGB的坐标,这里有个点需要注意一下,虽然RGB的位置可以确定一个颜色空间,但是“white point”并不唯一,如下图17所示,D50和D65代表的是不同的白点位置。因此要舌形图中指定一个颜色空间,除了RGB的坐标,还需要指定白点的位置,常用的是D50和D65。

图17 sRGB’s white point
在图16的RGB坐标里面有三个值,分别是x,y和Y,x和y比较好理解,对着左边的舌形图找坐标,就能看见R(0.64,0.33),G(0.30,0.60),B(0.15,0.06)分别代表三个颜色空间的三个顶点,但是Y就比较难理解了,好像根本找不到它的位置?答案是:Y代表的是XYZ域里面的Y,三分量加起来是1。
之前讲过,要确定一个颜色,光有颜色和饱和度是不够的,还需要亮度,这三个加起来才能唯一确定一个颜色,舌形图的目标是只考虑色域不考虑亮度,以方便定量的研究颜色,但是这并不代表着亮度可以不存在。
三、从XYZ到sRGB——CCM和Gamma
紧接着文档就给出了CIE XYZ到sRGB的映射矩阵,说明了这个映射矩阵的白点是D65,强调这是一个线性的sRGB空间,并且指出sRGB限定了gamma矫正的值,CIE给这个颜色空间取名为709颜色空间。

图18 CIE XYZ to sRGB conversion
但是文档中没给出这个矩阵的推导过程,楼主找了些资料,映射矩阵的推导过程如下:
1. 隐藏条件:ICCV给出了R=CIE xyY(0.64,0.33,0.2126)、G=CIE xyY(0.30,0.60,0.7153)和B=CIE xyY(0.15,0.06,0.0721),这里有个隐藏条件,xyY是XYZ在x+y+z=1平面上的投影,这就说明z=1-x-y,可以算出R=(0.64,0.33,0.03)、G=(0.30,0.60,0.10)和B=(0.15,0.06,0.79),它和XYZ有个比例关系,如公式(1)所示:
(1)
2. 公式(1)给出了从xy到XYZ的变换矩阵,考虑到我们要变换RGB共三个分量,且已经有了RGB坐标和Y,则可以直接推导出从sRGB到XYZ的矩阵公式为(2):
(2)
3. 直接把数据代入公式(2),就得到了从sRGB到XYZ的矩阵M:
(3)
4. M的逆就是XYZ转sRGB的矩阵(4)。
(4)
这里算出的结果(4)和文档中的有点儿差异,因为文档中没给出明确的白点坐标,用(3)横着相加,算出的白点坐标是(0.9502,1,1.0878),这个和网上查出的D65坐标(0.95047,1,1.08883)有出入,可能和计算精度有关,或者大家也可以自己推导一下,找出楼主的计算错误。
到这里,公式(4)就是ISP中常见的CCM,它的作用就是把颜色空间从XYZ转到sRGB,不过严格来说,在CCM之后再做一个gamma才会到达真正的sRGB空间。文档中提到Stevens指出人类对亮度的感知遵循幂律(图19),也就是人眼感光度与亮度正好相反,人眼对暗区的事物会更敏感,对亮区反而没那么敏感,结论是人眼感知到的亮度恒定增加的时候,辐射功率需要按照指数变化。

图19 Stevens’ power law
图20 做了一些说明,sRGB gamma接近Stenen的1/3幂率,应用gamma的原因是它重新映射了线性颜色,以更好的适应人类视觉系统对辐射功率(也就是物体光反射)的非线性响应,而不是很多教科书里面写的那样,认为gamma被用于补偿显示。

图20 sRGB gamma
ICCV作为权威,其公开PPT说gamma不是为了补偿显示,楼主选择相信。从这个PPT来看,gamma就是一个非均匀映射,它给暗区分配了更多的映射范围,这样做的好处是,给低亮度的区域做个拉伸,效果如图21所示,在gamma矫正后暗区的细节可以看得更清楚了。

图21 gamma的效果
到这里,文档中关于颜色空间的原理部分就算是结束了,其中对ISP的理解比较有帮助的是从光谱到sRGB空间的推导。这个过程推导解释了ISP中白平衡、CCM和gamma这三个模块的原理和作用,整个过程都是在模拟人眼视物的需求进行,力求把sensor获得的图像变得符合人眼对颜色的认知。
接下来的一篇还是颜色空间,主要是不用的颜色空间各有什么特点,会用在哪些领域。