Camera 图像处理原理分析 色彩篇 1 前言 做为拍照的核心模块之一,camera sensor 效果的调整,涉及到众多的参数,如果对基本的光学原理及 sensor 软/硬件对图像处理的原理能有深入的理解和把握的话, 对我们的工作将会起到事半功倍的效果否则,缺乏了理论的指导,只能是凭感觉和经验去碰,往往无法准确的把握问题的关键,不能掌握 sensor调试的核心技术,无法根本的解决问题 所以,这里笔者结合自己出于对摄影的爱好所学习的一些图像处理相关的原理,试图通过分析一些与 Sensor 图像处理相关的因素,和大家分享一下自己的一些理解,共同探讨,共同学习进步 2 色彩感应及校正 2.1 原理 人眼对色彩的识别,是基于人眼对光线存在三种不同的感应单元,不同的感应单元对不同波段的光有不同的响应曲线的原理,通过大脑的合成得到色彩的感知 一般来说,我们可以通俗的用 RGB 三基色的概念来理解颜色的分解和合成 理论上,如果人眼和 sensor 对光谱的色光的响应,在光谱上的体现如下的话,基本上对三色光的响应,相互之间不会发生影响,没有所谓的交叉效应。
但是,实际情况并没有如此理想,下图表示了人眼的三色感应系统对光谱的响应情况可见 RGB 的响应并不是完全独立的 下图则表示了某 Kodak 相机光谱的响应可见其与人眼的响应曲线有较大的区别 2.2 对 sensor 的色彩感应的校正 既然我们已经看到 sensor 对光谱的响应,在 RGB 各分量上与人眼对光谱的响应通常是有偏差的,当然就需要对其进行校正不光是在交叉效应上,同样对色彩各分量的响应强度也需要校正通常的做法是通过一个色彩校正矩阵对颜色进行一次校正 1 该色彩校正的运算通常是由 sensor 模块集成或后端的 ISP 完成, 软件通过修改相关寄存器得到正确的校正结果值得注意的一点是,由于 RGB -> YUV 的转换也是通过一个 3*3 的变换矩阵来实现的,所以有时候这两个矩阵在 ISP 处理的过程中会合并在一起,通过一次矩阵运算操作完成色彩的校正和颜色空间的转换 3 颜色空间 3.1 分类 实际上颜色的描述是非常复杂的,比如 RGB 三基色加光系统就不能涵盖所有可能的颜色,出于各种色彩表达,以及色彩变换和软硬件应用的需求,存在各种各样的颜色模型及色彩空间的表达方式。
这些颜色模型,根据不同的划分标准,可以按不同的原则划分为不同的类别 匹配任意可见光所需的三原色光比例曲线 对于 sensor 来说,我们经常接触到的色彩空间的概念,主要是 RGB , YUV 这两种(实际上,这两种体系包含了许多种不同的颜色表达方式和模型,如 sRGB, Adobe RGB, YUV422, YUV420 …) , RGB 如前所述就是按三基色加光系统的原理来描述颜色,而 YUV 则是按照 亮度,色差的原理来描述颜色 3.1.1 RGB <-> YUV 的转换 不比其它颜色空间的转换有一个标准的转换公式,因为 YUV 在很大程度上是与硬件相关的,所以 RGB 与YUV 的转换公式通常会多个版本,略有不同 常见的公式如下: Y=0.30R+0.59G+0.11B U=0.493(B-Y) = -0.15R-0.29G+0.44B V=0.877(R-Y) = 0.62R-0.52G-0.10B 但是这样获得的 YUV 值存在着负值以及取值范围上下限之差不为 255 等等问题,不利于计算机处理,所以根据不同的理解和需求,通常在软件处理中会用到各种不同的变形的公式,这里就不列举了。
体现在 Sensor 上,我们也会发现有些 Sensor 可以设置 YUV 的输出取值范围原因就在于此 从公式中,我们关键要理解的一点是,UV 信号实际上就是蓝色差信号和红色差信号,进而言之,实际上一定程度上间接的代表了蓝色和红色的强度,理解这一点对于我们理解各种颜色变换处理的过程会有很大的帮助 1.1 白平衡 1.1.1 色温 色温的定义: 将黑体从绝对零度开始加温, 温度每升高一度称为 1 开氏度(用字母 K 来表示),当温度升高到一定程度时候, 黑体便辐射出可见光, 其光谱成份以及给人的感觉也会着温度的不断升高发生相应的变化 于是, 就把黑体辐射一定色光的温度定为发射相同色光光源的色温 常见光源色温: 光源 色温(K) 钨丝灯(白炽灯) 2500-3200k 碳棒灯 4000-5500k 荧光灯(日光灯,节能灯) 4500-6500k 氙灯 5600 k 炭精灯 5500~6500k 日光平均 5400k 有云天气下的日光 6500-7000k 阴天日光 12000-18000k 随着色温的升高, 光源的颜色由暖色向冷色过渡, 光源中的能量分布也由红光端向蓝光端偏移。
值得注意的是,实际光源的光谱分布各不相同,而色温只是代表了能量的偏重程度,并不反映具体的光谱分布,所以即使相同色温的光源,也可能引起不同的色彩反应 人眼及大脑对色温有一定的生理和心理的自适应性,所以看到的颜色受色温偏移的影响较小,而 camera 的 sersor 没有这种能力,所以拍出来的照片不经过白平衡处理的话,和人眼看到的颜色会有较大的偏差(虽然人眼看到的和白光下真实的色彩也有偏差) 太阳光色温随天气和时间变化的原因,与不同频率光的折射率有关: 波长长的光线,折射率小,透射能力强,波长短的光线,折射率大,容易被散射,折射率低,这也就是为什么交通灯用红色,防雾灯通常是黄色,天空为什么是蓝色的等等现象的原因 知道了这一点,太阳光色温变化的规律和原因也就可以理解和分析了,留给大家自己思考 1.1.1 色温变化时的色彩校正 所以从理论上可以看出,随着色温的升高,要对色温进行较正,否则,物体在这样的光线条件下所表现出来的颜色就会偏离其正常的颜色,因此需要降低 sensor 对红色的增益,增加sersor 对蓝光的增益同时在调整参数时一定程度上要考虑到整体亮度的要保持大致的不变,即以 YUV 来衡量时,Y 值要基本保持不变,理论上认为可以参考 RGB->YUV 变换公式中,RGB 三分量对 Y 值的贡献,从而确定 RGAIN 和 BGAIN 的变化的比例关系。
但实际情况比这还要复杂一些,要考虑到不同 sensor 对 R,B 的感光的交叉影响和非线性,所以最佳值可能和理论值会有一些偏差 1.1.2 自动白平衡原理 1.1.2.1 原理 自动白平衡是基于假设场景的色彩的平均值落在一个特定的范围内, 如果测量得到结果偏离该范围,则调整对应参数,校正直到其均值落入指定范围该处理过程可能基于 YUV 空间,也可能基于 RGB 空间来进行对于 Sensor 来说,通常的处理方式是通过校正 R/B 增益,使得 UV 值落在一个指定的范围内从而实现自动白平衡 1.1.2.2 特殊情况的处理 在自动白平衡中,容易遇到的问题是,如果拍摄的场景,排除光线色温的影响,其本身颜色就是偏离平均颜色值的,比如大面积的偏向某种颜色的图案如:草地,红旗,蓝天等等,这时候,强制白平衡将其平均颜色调整到灰色附近,图像颜色就会严重失真 因此,通常的做法是:在处理自动白平衡时,除了做为目标结果的预期颜色范围外,另外再设置一对源图像的颜色范围阙值, 如果未经处理的图像其颜色均值超出了该阙值的话, 根本就不对其做自动白平衡处理由此保证了上述特殊情况的正确处理。
可见,这两对阙值的确定对于自动白平衡的效果起着关键性的作用 1.1.3 某平台的例子 英文代码 中文界面 色温 色温 RGAIN, GGAIN, BGAIN cloud 阴天 7500k 0x1D4C, 0x00CD, 0x0085, 0x0080 daylight 日光 6500k 0x1964, 0x00A3, 0x0080, 0x0088 INCANDESCENCE 白热光 5000k 0x1388, 0x00A5, 0x0080, 0x0088 FLUORESCENT 日光灯 4400k 0x1130, 0x0098, 0x0080, 0x00A8 TUNGSTEN 钨丝灯 2800k 0x0AF0, 0x0080, 0x0081, 0x00A4 可以看到随着色温的升高, 其变化规律基本符合上节中的理论分析 不过这里多数参数与理论值都有一些偏差, 其中日光灯的色温参数设置与理论值有较大的偏差, 实际效果也证明该日光灯的参数设置使得在家用日光灯环境下拍摄得到的照片颜色偏蓝。
修改其参数后实拍效果明显改善再查一些资料可以看到通常会有两种荧光灯色温 4000 和 5000K,目前我所接触到的应该是 5000K 居多) 1.1.4 调试和验证 具体参数的调整,应该在灯箱环境下,使用各种已知色温的标准光源对标准色卡拍摄,在 Pc 机上由取色工具测量得到其与标准色板的 RGB 分量上的色彩偏差,相应的调整各分量增益的比例关系 为了更精确的得到结果, 曝光量增益的设置在此之前应该相对准确的校正过 颜色相关特效处理 1.1 grayscale (灰阶) 灰阶图的效果就是将彩色图片转换为黑白图片 1.2 理论 理论上,在 YUV 空间,将 UV 分量丢弃,只保留 Y 分量,这样就可以得到黑白图像,这也是彩色电式机信号能兼容黑白电视机的原理如下图理论上 Y 值一样的颜色(右边是用 acdsee 转成灰度图的效果),在grayscale 模式下看应该是一样的颜色 算法上的操作,理论上应该把 UV 值改成灰色对应数值就可以了不过根据软件算法和硬件结构的不同,具体代码也会有不同。
1.3 以某平台为例 核心的两行代码如下: SET_HUE_U_GAIN(0); SET_HUE_V_GAIN(0); 这里设置 UV GAIN 为 0,如果 UV offset 设置为 128 的话,最终得到的 UV 就是 128,这就和理论是相符合的 1.4 sepia / sepiagreen / sepiablue 所谓的复古(绿,蓝)就是在灰阶的基础上,对 UV 值额外再做了一个 offset,将灰度图转换成某种颜色的梯度图理论上为了获得蓝色效果,应该增加蓝色差信号,减小红色差信号即增大 U,减小 V 以 sepiablue 效果为例,这里的字节的 MSB 表示符号位:所以 88 为 88,158 为-30 SET_HUE_U_GAIN(0); SET_HUE_V_GAIN(0); SET_HUE_U_OFFSET(88); SET_HUE_V_OFFSET(158); 1.5 negative 所谓负片效果,就是将图像的颜色反转,看起来就像是在看胶片底片时的效果。
这从理论上也很容易理解和处理,就是在 RGB 空间,取其补色,具体的操作就是用 255 分别减去 RGB 得到新的 RGB 值通常会在 ISP 中实现该功能 2 小结 理解了原理,要做出其它颜色变换方面的效果就很容易了 基本上,在颜色校正和处理方面,需要考虑的相关参数大致包括: 自动 WB 上下限, 自动白平衡时的目标范围,RGB gain, UV gain, UV offset, color correction.有些还会有 saturation 和 hue 相关的设置 从 sensor 或 ISP 硬件处理的流程上说,通常方向是先做 RGB gain,再做 color correction,最后做 YUV空间的处理所以调整效果的时候,为了减少参数之间的相互影响,基本上也可以按这个顺序来调整参数 。