做为拍照手机的核心模块之一,camera sensor 效果的调整,涉及到众多的参数,如果对基本的光学原理及 sensor 软/硬件对图像处理的原理能有深入的理解和把握的话,对我们的工作将会起到事半功倍的效果。
人眼对色彩的识别,是基于人眼对光谱存在三种不同的感应单元,不同的感应单元对不同波段的光有不同的响应曲线的原理,通过大脑的合成得到色彩的感知。一般来说,我们可以通俗的用RGB三基色的概念来理解颜色的分解和合成。以下是正常的RGB光谱:
但是,实际情况并没有如此理想,下图表示了人眼的三色感应系统对光谱的响应情况,可见RGB的响应并不是完全独立的。
下图则表示了 Kodak 某相机光谱的响应。可见其与人眼的响应曲线有较大的区别。
既然我们已经看到sensor 对光谱的响应,在RGB各分量上与人眼对光谱的响应通常是有偏差的,当然就需要对其进行校正。不光是在交叉效应上,同样对色彩各分量的响应强度也需要校正。通常的做法是通过一个色彩校正矩阵对颜色进行一次校正。 如下:
该色彩校正的运算通常由ISP 完成,软件通过修改相关寄存器得到正确的校正结果。值得注意的一点是,由于 RGB -> YUV的转换也是通过一个 3*3 的变换矩阵来实现的,所以有时候这两个矩阵在 ISP 处理的过程中会合并在一起,通过一次矩阵运算操作完成色彩的校正和颜色空间的转换。
对于sensor 来说,我们经常接触到的色彩空间的概念,主要是RGB , YUV这两种(实际上,这两种体系包含了许多种不同的颜色表达方式和模型,如sRGB, Adobe RGB, YUV422, YUV420 …),RGB如前所述就是按三基色加光系统的原理来描述颜色,而YUV则是按照亮度,色差的原理来描述颜色。
不比其它颜色空间的转换有一个标准的转换公式,因为YUV在很大程度上是与硬件相关的,所以RGB与YUV的转换公式通常会多个版本,略有不同。常见的公式如下:
PAL 制:
Y=0.299R+0.587G+0.114B
U=0.493(B-Y) = -0.15R-0.29G+0.44B
V=0.877(R-Y) = 0.62R-0.52G-0.10B
此外,还有,NTSC制:
我们关键要理解的一点是,UV 信号实际上就是蓝色差信号和红色差信号,进而言之,实际上一定程度上间接的代表了蓝色和红色的强度。
色温的定义:将黑体从绝对零度开始加温,温度每升高一度称为1开氏度(用字母K表示),当温度升高到一定程度时候,黑体便辐射出可见光,其光谱成份以及给人的感觉也会着温度的不断升高发生相应变化。于是,就把黑体辐射一定色光的温度定为发射相同色光光源的色温。
随着色温的升高,光源的颜色由暖色向冷色过渡,光源中的能量分布也由红光端向蓝光端偏移。值得注意的是,实际光源的光谱分布各不相同,而色温只是代表了能量的偏重程度,并不反映具体的光谱分布,所以即使相同色温的光源,也可能引起不同的色彩反应。人眼及大脑对色温有一定的生理和心理的自适应性,所以看到的颜色受色温偏移的影响较小,而camera的sersor 没有这种能力,所以拍出来的照片不经过白平衡处理的话,和人眼看到的颜色会有较大的偏差(虽然人眼看到的和白光下真实的色彩也有偏差)。
所以从理论上可以看出,随着色温的升高,要对色温进行较正,否则物体在这样的光线条件下所表现出来的颜色就会偏离其正常的颜色,因此需要降低sensor对红色的增益,增加sersor对蓝光的增益。
自动白平衡是基于假设场景的色彩的平均值落在一个特定的范围内,如果测量得到结果偏离该范围,则调整对应参数,校正直到其均值落入指定范围。该处理过程可能基于YUV空间,也可能基于RGB空间来进行。对于Sensor 来说,通常的处理方式是通过校正R/B增益,使得UV值落在一个指定的范围内。从而实现自动白平衡。
在自动白平衡中,容易遇到的问题是如果拍摄的场景,排除光线色温的影响,其本身颜色就是偏离平均颜色值的,比如大面积的偏向某种颜色的图案如:草地,红旗,蓝天等等,这时候,强制白平衡将其平均颜色调整到灰色附近,图像颜色就会严重失真。因此,通常的做法是:在处理自动白平衡时,除了做为目标结果的预期颜色范围外,另外再设置一对源图像的颜色范围阙值,如果未经处理的图像其颜色均值超出了该阙值的话,根本就不对其做自动白平衡处理。由此保证了上述特殊情况的正确处理。
从最明亮到最黑暗,假设人眼能够看到一定的范围,那么胶片(或CCD 等电子感光器件)所能表现的远比人眼看到的范围小的多,而这个有限的范围就是感光宽容度。
人眼的感光宽容度比胶片要高很多,而胶片的感光宽容度要比数码相机的ccd高出很多!对于sensor来说,又是如何来判断曝光是否正确呢?很标准的做法就是在YUV空间计算当前图像的Y值的均值。调节各种曝光参数设定(自动或手动),使得该均值落在一个目标值附近的时候,就认为得到了正确的曝光。
在多数数码相机和拍照手机上都可以看到曝光级别设定的功能,如前所述,这种设定实际上是在自动曝光的基础上给用户提供一定的曝光控制能力,强制改变camera sensor的曝光判断标准,获得用户想要的效果。通常的做法就是改变Y值均值的预期值,使得sensor在自动曝光时以新的Y预期值为目标,自动调整Exptime 和AG。
曝光的均值正确了,不代表整体图像的亮度分布就和人眼所看到的保持一致了。事实上,人眼对亮度的响应并不是一个线性的比例关系,而各种涉及到光电转换的设备的输入输出特性曲线一般也是非线性的,对于sensor来说,其响应倒是接近为线性关系,所以为了在各种设备上正确输出符合人眼对亮度的响应的图像,就需要进行校正。幂函数的指数的倒数就是通常所说的 gamma 值。
Gamma校正的原意是针对CRT显示器的,由于CRT显示器是通过电子束撞击荧光屏产生亮光来实现图像的显示。但是由于电子束的能量与产生的亮光的大小不成正比,而需要通过Gamma校正来使两者对应起来。但在图像质量调整中Gamma校正失去的原来的意义。它能起到的作用很多,它几乎可以影响到图像质量调整的各个方面。在图像质量调整中,Gamma校正的一个重要作用是体现细节,增强对比度。由于人眼对于高亮度的差别感觉不明显,而对低亮度的细小差别感觉较为明显,因此,Gamma校正通过将低亮度部分的差距拉大,而造成低亮度部分的细节能够被人眼明显的感觉出来,而图像的细节部分基本上都是纯在于低亮度部分的。
一般来说Gamma曲线是一条向上凸的指数曲线。横坐标表示输入数据,纵坐标表示输出数据。经过Gamma校正后,图像数据就会依据曲线上点的横坐标和纵坐标,把输入的图像数据校正成输出的图像数据。举例来说,假设曲线上有一个点的坐标是(100,120),那么输入图像数据中所有值为100的数据,在输出图像数据中都会变成120。一般的理解,认为Gamma校正能够提高亮度,其实这样理解并不完全对。也就是说Gamma校正并不能提高图像的整体亮度。它的作用就是将Sensor送过来的原始数据进行非线性调整为另外一组数据。因为在低值部分的Gamma曲线的斜率超过1,那么校正后的数据,在低值部分的差距会被拉大,而在高值部分的斜率小于1,那么高值部分的数据之间的差距会变小。这样的图像数据,处于低值的细节部分会被提升的更明显,而高值部分的由于人眼感觉本来就不会很明显,因此也不会造成图像细节的损失。
通常对于Window 的输出显示系统,gamma值为2.2,而对于苹果的输出显示系统和打印系统来说,gamma值为1.8。由于指数运算需要消耗大量的CPU时间,所以实际的做法,往往是将gamma曲线用比如12段线段进行拟合。这样只需要保存13个点的数据,用线性变换或查表的方式进行gamma校正。要调整gamma校正实际上也就是调整这13个点的数值。
对比度的调整在一定程度上说,其实也就是对gamma曲线的调整,增大对比度就是提Gamma 值。对于图像处理来说,也有在硬件 gamma 校正后,单独由软件再进行一次类的幂函数变换来调整对比度。