我们用单反或者手机拍照的时候,从取景到最终出图,是有一个完整的 pipeline 的,今天我们就大概介绍一下这个 pipeline:如何从环境光到 RAW 图再到最后的 JPEG 图。
以前的摄影,都是黑白照片,虽然光的色散很早就发现了,可是彩色照相却很晚才有,尤其是数字照相,人们一直没有找到很好的方法来捕捉颜色,直到 Bayer 模式的发明,现在的数字 sensor 都是基于 Bayer 模式的,sensor 上的每个像素点,一般来说都是全通的,也就是所有的可见光都能激发光电效应,为了让 sensor 只对特定波长的光有响应,现在的 sensor 都会加一个 color filter array (CFA),这个 CFA 就是
为了滤掉其他频率的光,而只让特定频率的光通过,从而在 sensor 上形成不同的颜色响应,如下图所示:
Bayer 模式,让 sensor 能够让每个像素点记录单一颜色的信息,这样一个 sensor 上,就可以同时记录 R, G, B 三个通道的颜色信息,再通过后面的处理,形成彩色图像。sensor 主要有 CCD 和 CMOS 两种,目前主流的都是 CMOS 结构。
下图给出了 CFA 对 R, G, B 三种颜色光的响应,CFA 就是起到一个过滤的作用。
光打到 sensor 上,因为光电效应,所以会有电子被激发出来,这些电子被收集起来,形成一种电势能,这些能量通过 A/D 转换成数字信号,表示每个像素值的大小,这大概就是 sensor 从光到电再到信号的一个过程。
既然 sensor 需要光线来激发,那么,没有光线的时候,理想情况下,sensor 上应该没有能量,可是,实际情况,却并非如此,因为噪声的存在,sensor 在没有光线照射的时候,也有可能会有电信号存在,这些电信号其实都是噪声,会对 A/D 转换造成干扰,使得最终的像素值不够准确,所以在成像流程中,都会有一个 Black light subtraction,因为这个暗噪声完全和 sensor 的设计有关,所以每个相机的成像流程里,这一步都是通过一个查找表来实现。
去除暗噪声之后,还会有一个信号放大的处理,我们拍照的时候,会有一个 ISO 的设置,这个其实和相机拍照中的信号增益系数是有一定联系的,高 ISO 值,意味着更高的信号增益,但也意味着更多的噪声。
此外,还有坏点检测与去除, 现在的 sensor 都是千万像素级的,有的时候,可能会有几个像素不能 work,这些像素点就是坏点,可以通过一些方式去除。此外还可能会有一些校正的操作,比如常见的 Vignetting 现象,这是因为光在传播过程中,也会有能量损失,光路越长,损失的能量越大,所以,一般来说,光线到达 sensor 中央的距离比到达四周的距离要短,所以光线的能量在 sensor 中央是最大的,而在四周会逐渐减弱,如下图所示。
此图来源于 computational photograph, CMU 2018 lecture 2
这个 vignetting 现象,也是需要校正的,一般通过事先设置好的查找表来实现。
这一步,主要是将 sensor 收集到的光能量进行转换成数字信号,出来的就是我们常见的 RAW 图,这个时候的 RAW 图,其像素值和环境光线的强弱是线性关系。
拿到 RAW 图之后,我们要做一个白平衡校正,前面介绍颜色的时候说过,人眼有一个颜色常恒的特性,可是相机没有,所以一般需要做一个白平衡校正,我们用单反拍照的时候,会有一个白平衡的设置,这个其实就是一个白平衡校正,每个设置都对应了一个校正的查找表,还有就是自动白平衡校正,自动白平衡校正的方法有很多,这里介绍两种最基本的,一个是基于灰度世界假设,一个是基于 white batch 的方法。
灰度世界假设,就是说一个环境里,所有反射光的均值应该是灰色的,就是说不偏向于任何一种颜色,所以这种假设,也就认为 sensor 上三个通道的像素值的均值应该是一样的:
灰度世界假设,会求出 sensor 每个通道的均值,然后以绿色通道的作为基准,求出一个比例系数,对 R,G,B三个通道进行白平衡校正:
灰度世界假设,是利用均值相等的假设,而 white patch 的方法,是利用了三个通道最大值应该相等的假设,所以 white patch 会先求出三个通道的最大值:
然后同样以绿色通道作为基准,计算出一个映射系数,对 R,G,B 进行校正:
白平衡之后,是 demosaic 因为 Bayer 模式将三个通道的信息记录在一个 sensor 上,常规的 Bayer 模式,G 通道占 1/2,R 和 B 通道各占 1/4,所以需要通过插值,将 R, G, B 三个通道都占满:
demosaic 也有很多方法,主要是基于插值的一些方法,也有专门为 demosaic 开发的插值算法。
将三个通道补齐之后,需要进行降噪处理,denoise 就是运用各种降噪算法对图像进行降噪。这个环节也是有很多不同的算法。噪声的来源有很多,有光电效应引入的噪声,这个噪声主要和环境的光照强度有关,光照越充足,噪声越小,基本假设成泊松分布。
有 sensor 器件本身的暗噪声,这个噪声是器件自带的,和环境温度有关,温度越高,sensor 里的粒子运动越频繁,暗噪声也就可能越大。还有 A/D 转换时候的电噪声。这些噪声往往是混杂在一起,在图像上,就给人一种颗粒感,让图像看起来有点 “脏”,所以降噪质量,是相机成像流程里非常重要的一个环节,特别是在拍摄夜景的时候,图像降噪,现在也有很多算法,近来随着深度学习的兴起,也有很多人尝试利用深度学习来做降噪。
前面这些步骤搞定之后,我们到了比较关键的一步,颜色体系转换,之前的 RGB 都是和设备相关的 RGB 颜色体系,也可以认为是 sensor RGB,这一步要把 sensor RGB 转换成 sRGB,也就是与设备无关的标准 RGB 体系,然后再从 sRGB 体系,转换到和显示相关的 RGB 体系。在转换之前,要确保白平衡已经校正过了,
得到标准的颜色体系之后,为了让照片看起来更加 nice,一般都会有一个 tone mapping 的算法,这又是各大厂商各显神通之处,看看下面不同的 tone mapping 曲线得到的效果:
不过这一步还有一个点要注意,在 Tone mapping 之前,像素值和环境光照一直维持一种线性关系,tone mapping 之后,这种线性关系被破坏了,我们知道,RAW 图一般都是 10bit 或者 12 bit 表示一个通道,而我们最后显示的 RGB 图像,一般都是 8 bit 表示一个通道,所以这个动态范围的压缩,导致信息的丢失,之前的线性关系也就不存在了。
最后,是将图像文件压缩成 JPG 格式输出。
到这里为止,基本上就是一个完整的相机成像流程了。
以上图片除特别声明外,都来源于 Understanding the In-Camera Image Processing Pipeline for Computer Vision", Michael S. Brown,CVPR 2016 Tutorial