手机上的摄像头,是一个微型的照相机,用CMOS传感器来充当照相机的底片。当外界景物发出的光线,经过镜头成像到COMS传感器上,此时得到的是一个倒立的缩小的二维的图像。这个二维图像本身是由无穷多个点组成的,先不考虑颜色通道当作黑白图像处理的话,是一个光强随二维坐标值变化而变化的模拟信号。
以前我们用卤化银当底片拍照的时候,底片上的感光颗粒,其实是难以数清的,看起来好像有无穷多个像素,所以它的像素不能用确定的数值表示。冲洗出来的照片画面很细腻,但像素也不是真的无穷大,如果冲印放大到很大的尺寸后,还是可以看出模糊了。每个颗粒的感光量也是不好算清楚和量化的,所以传统胶片相机的底片保存的是模拟信号。
而当用CMOS传感器来充当底片时,传感器上的二维阵列单元的个数,就是摄像头的像素,或者叫摄像头的分辨率,是可以确定具体数值的,比如常见1200万像素的摄像头分辨率为4032x3024。所以此时分辨率可以理解为图像信号空间上的采样率,分辨率越高则采样率越高,失真就越小,越接近真相,看起来越清晰。
CMOS传感器把每个像素接收到的光信号转换成电荷,完成了光信号到电信号的转换。再对模拟信号进行AD转换得到量化后的数字信号,一般用10bit来表示一个像素的数值。我们知道模拟信号转换为数字信号,需要经过采样和量化,这两步都会造成精度上的损失。此时得到的是RAW数据,其本质一个二维数组,每个元素用10bit表示取值0~1023。
但分辨率也不能无限制高下去,因为手机摄像头的体积有限,所以CMOS传感器的总面积有限,分辨率越高的话,则每个像素分到的面积会变小,感光的能力会变差,也更容易收到干扰,会导致噪点增多画质变差。
传统的胶片相机,取景和成片的光路是分开的。光学取景器可以实时看到动态的成像画面,但只有按下快门键的时候,才会打开机械快门,让光进入底片所在的暗室,完成一次拍照的曝光。
AV + TV = BV + SV
那就提下曝光的公式,AV是光圈值的级数,TV是曝光时间值的级数,BV是环境亮度值的级数,SV是底片的感光灵敏度的级数。解释一下,等式左边是曝光过程的供给侧,等式右边是需求侧。环境越暗需求越大,底片灵敏度低需求也越大。此时需要加大光圈的开孔尺寸,或者增加曝光持续的时间,反之亦然。
对于手机摄像头来说,光圈是固定的,底片的感光灵敏度可以通过设置ISO来调节,曝光时间不是通过传统的机械快门打开的时间来控制的,而是通过控制CMOS传感器的寄存器,来控制光信号积分的时间。也就是光一直照射在CMOS传感器上,只不过通过开关来控制器件的曝光工作周期的开始和结束,并且一般是一行一行来控制的。
摄像头一般通过MIPI接口把RAW数据传输到平台的ISP模块。ISP里有个像素信息统计模块,可以统计RGB分量的值。然后ISP根据统计信息来进行3A的调整。
AF就是自动调整参数使画面对焦清晰。以对比度对焦的方式为例,根据RAW图算出来的对比度,来调整镜头的位置,找到使画面对比度最高时镜头的位置。镜头一般安装在VCM马达上,所以就通过控制马达控制芯片的寄存器来控制马达的位置,进而控制镜头的位置。
需要注意的是,变焦和对焦是不同的概念。手机摄像头的镜头组是无法改变每个镜片之间的距离,所以焦距是无法改变的,也就无法实现光学变焦。现在有些手机的可以实现10的光学变焦,是通过切换两个不同焦距的摄像头来实现。为了避免跑题,变焦可能需要放到另外的文章来解释。
AE就是就自动调整参数使画面曝光正确,根据RAW图得到的统计信息,来确定当前是要增加曝光量还是减少曝光量。通过控制sensor的寄存器来实现控制曝光时间和ISO,进而控制曝光量。
AWB就是自动调整参数使画面整体的颜色正确,根据RAW图得到的统计信息,来控制R/G和B/G的gain值,进而来控制颜色的倾向。
经过3A的调整后,RAW图就是一张清晰的,亮暗合适,颜色正常的图片。具体一点,其实颜色还需要经过ISP的CCM模块矫正,因为模组里的CFA的RGB三通道的响应和我们人眼响应有差异,所以需要经过颜色矫正。
RAW经过解马赛克可以得到RGB888格式的数据,数据由10bit压缩到8bit,会丢失一些精度。RGB888再经过线性变换可以得到YUV格式的数据,如果是预览的话,可以直接把YUV数据回调给应用层去显示。如果是录像的话,可以把YUV数据传入编码器编码后保存到文件。拍照的话,需要把YUV进一步编码压缩成JPEG格式的数据,这一步会损失一些信息。