Auto-exposure
处理的第一步就是确定曝光和增益(数字和模拟)。
一般说来,isp芯片会负责决定相机的曝光、增益、对焦、白平衡,我们可以直接用isp的参数。isp的参数在大部分时候都比较合适,但是在高动态范围场景中,直接用isp的参数可能会让得到的图像高光区域过曝或者说暗光部分欠曝,而且这些缺陷在接下来的hdr色调映射中无法补救。
google自定义了一套算法来完成自动曝光。不仅包括了曝光,还考虑了接下来的动态范围压缩。针对hdr场景的自动曝光包括三步:
1.刻意欠曝。
2.捕获多帧。
3.压缩动态范围(利用局部色调映射)。
欠曝其实并不是什么新东西,在数字SLR中被称作”向右曝光“,在G家这套系统中之所以能用上欠曝是因为多帧合成提供了足够的降噪性能。其实从效果上来说,G家这套算法就是降噪。
具体来说,在这个章节里,要解决三个问题,曝光量,动态压缩范围以及捕获帧数。
关于曝光量,实际上要确定两个曝光量,因为在接下来的hdr tone mapping中,我们还需要另一帧。一帧是欠曝的,另一帧是给欠曝的这一帧再加上数字增益后得到的。数字增益补偿了欠曝的部分。总结一下就是,一帧欠曝的记录场景,另一帧,在前一帧上添加了数字增益的合成帧用以hdr tone mapping。因此除了曝光量还要确定增益量。
曝光量在不同的场景下差别很大,谷歌举了一个例子。一般来说,让太阳部分过曝都是没有什么问题的,但是在夕阳或者清晨,就不能这么做。假如海边的夕阳,夕阳周围的光晕还要上色,即便这会使我们的海滩变得很暗。google的解决方案简答粗暴,它们用传统的HDR bracking建立了一个5000+的场景库,然后人工确定了最合适的两个参数(曝光和增益)。
那么如何把得到的帧与场景库中的存储进行匹配呢?google用的是图像的亮度分布(image brightness distribution),在得到这个分布之前,对图像进行过预处理,包括白平衡和激进的降采样。图像的特征提取包括4组,每组64个非均匀空间分布的值,值在两个不同的空间比例下得到,并针对RGB通道的最大和平均值进行测量。这样分别能帮助表示不同空间频率的曝光还可以解决色彩修整的问题。在计算这些值的时候,我们为了加强图像的中间部分,给这部分一个固定的权值。并且在人脸出现的部分给很高的权值。我们同样把搜索的范围限制到了当前帧亮度的8倍。这有助于保持对场景亮度的感知,避免例如不自然的昼夜渲染。
在找到一组符合要求的场景之后,我们对这组场景计算得到一个东西的加权混合。这个东西就是手动调整过的自动曝光。混合之后就是我们需要的两个参数。实际上就是把匹配场景的两个参数做加权平均,结果就作为最终结果。加的权主要是中间和人脸。
具体参数的生成方面,google用的是一个相对固定的映射。参数包括快门时间/曝光时间和iso。总的来说,从最亮的场景(最低iso,最快快门8ms)逐渐变暗的过程中,先保持快门时间不变,增加iso,然后同时增加到100ms和96倍最低iso,两者以对数比例同时增加。为了获得最大的信噪比,使用模拟增益时没有任何限制,要多少给多少,如果还不够(超过传感器所能提供的最大值),会在流水线中增加数字增益。、
帧数一般是2-8,在暗光或者高动态范围的情况下会多一些,但是多了对处理器和内存的开销都会增加。
另外,这套流程和用户在取景界面看到的画面是完全独立的,在按下快门的瞬间,曝光控制参数就已经是确定的了。为了节省资源开销,控制曝光的算法每4帧运行一次。