谷歌手机中的HDR技术——HDR+

HDR+作为谷歌应用在手机中的技术,不能不了解一下。作为手机中的应用,尤其是默认开启的功能,其实要求是比较高的:首先要快;要尽可能自动化;不能有artifact。而HDR中又可能面临着ghost问题,cartooniness,halo.

手机端特有的HDR问题

手机的光圈小,pixel手机镜头面积只有4.3m^2,而相机可以达到1360m^2。进光量少导致捕获的光线少,从而在暗光下的噪声多。一般的做法有增加光圈,长曝光,使用闪光灯,但都有对应的问题:造价贵;运动物体有重影;造成光晕。最终使用的一种方法是基于image stacking的,虽然image stacking一般用来多帧降噪。

手机用于量化的bit位也少,导致所能表达的动态范围小。

算法特点

特点之一是不需要使用包围曝光,而是像多帧降噪一样使用同一曝光时间。这样首先有利于对齐(多EV的对齐需要先将数据拉到同一亮度)。其次,曝光时间很短,还避免了高光溢出(如果曝光时间长,进光亮大,像素值很可能饱和,这样截断实际造成了信息丢失:只知道这里值很高,但是不知道到底有多高)。虽然是相同曝光,到底曝多少呢?这里使用的是自动曝光,自动曝光是要和场景语义相关的,雪地的结果应该亮一点,而日落要暗一定。作者使用了5000个场景的标注数据集,特别之处是每个场景的曝光标签有两个,分别针对highlight区域(要短曝)和shadow区域(要长曝)。两种曝光值的比值可以看作是HDR的压缩范围。

融合前的数据是10bit,融合后是一张14bit的图。得到高比特位图,所以可以应用标准HDR的tone mapping。

特点之二是使用bayer raw数据而不是demosaicked后的RGB/YUV数据。这样每个像素的比特数更多,同时也允许我们可以规避ISP中不想要的tone mapping和去噪。

特点之三是对齐中使用了基于FFT的方法,去噪中使用了Wienner滤波。

对齐——基于块

首先是参考帧的选取。参考帧的选取,是在抓拍的前3帧中选择对比度最强的那一帧。具体是在raw数据的G通道下计算梯度。

找到基准帧之后可以在non-reference和reference之间找到稠密的对应关系dense correspondence,也可以使用LK光流,基于亮度不变和平滑的假设,迭代地优化。还有基于patch和特征描述来稠密化稀疏的对应关系;还有使用过分割技术直接推断出几何关系和遮挡。为了在速度和质量之间取得平衡,hdr+使用了频率域的加速。

因为数据是raw数据,四个颜色通道相对于全图其实是下采样的,所以使得对齐问题是ill-posed。尽管可以demosaic,但是这样太耗时了。规避这一问题的方法是估计位移时以两个像素位单位,位移之后仍然是相同的颜色,将undersampling的问题后移到融合阶段,这样因为混叠造成的不匹配可以像其余没有对齐的一样被对待。

具体实现的方法是将RGGB的2x2block进行平均,这样对齐的输入就是3Mpix而不是12Mpix。将对齐的对象看作是块构成的网格(grid of tiles),每个tile共用一个位移向量(类似块匹配和稀疏光流的求解),每个tile大小为16x16或者32x32(噪声很大时)。为了避免块边界处有拼接感,tile之间有50%的重叠(这样除了边界像素,每个像素同时属于4个tile),并且使用中心加权。

对齐——基于金字塔

使用金字塔实现从粗到细的对齐。使用了四层高斯金字塔,相邻金字塔的尺度是2倍关系;coarser层的对齐结果上采样后作为下一层的初始化。

公式1D_p(u,v)=\sum_{y=0}^{n-1}\sum_{x=0}^{n-1}\left | T(x,y)-I(x+u+u_0,y+v+v_0) \right |^p

u,v是要估计的位移,u0,v0是从前一层继承的初始位移。公式1其实就是两个矩阵差的p阶矩,当它取最小值时,就求得了最终的位移。

没有最大化归一化互相关,使得对光照和对比度的变化没有鲁棒性,但是因为相机曝光是固定的,并且光照在一个burst中变化是很小的,所以这一点不会有负面影响。

在粗糙的层,搜索范围更大(小的变化可能体现不出来),但是精度要求高,因为直接关系到之后的精度。具体而言,在最粗的三层,统一使用L2距离,并且搜索范围是9x9;在最终的面积最大的一层,使用L1距离,搜索范围是3x3。L2速度慢,但是可以使用FFT加速;L1速度快,但是质量低。

金字塔的信息在两层之间传递就必须上采样,而当同一物体被分在不同tile或者tile跨越了运动的边界时when the coarse alignment straddles object or mo-tion boundaries,金字塔中的上采样是比较有挑战性的。所以当上一层的最佳偏移量不在初始值的搜索区域中时,标准的最近邻插值或者双线性插值会出错。解决办法是对上层的对齐结果做多个假设:不仅仅依赖于一个tile,而是从coarse-scale中选择三个块作为候选值,分别是整体最小的和每个方向的次小值。这一方法和SimpleFLow中的思想是一样的,只不过SimpleFLow在上采样中还使用了图像的信息。

融合

最终对齐时四个通道共用一个位移变化关系,融合时各通道单独融合。融合时像BM3D一样,在频域融合,融合之后再反变换为空域。这样可以增加稀疏性,避免噪声和没对齐的影响。

相比于直接使用reference和均值降噪,融合的过程是一个随着对齐失效缓慢向reference过渡的过程:每个输入帧与基准帧进行比较,得到各自权重,融合一次;对N次的融合结果取平均得到最终的融合结果。这样的pairwise merge对对齐失效的鲁棒性更强。

权重的计算和Wiener filter类似,同时还使用了sensor的噪声参数。

Fast subpixel L2 alignment

Corse scale上搜索半径大,所以D2的计算会很耗时,可以通过盒子滤波和卷积来快速实现。

分为三项,分别是T的平方项,滤波项,通过FFT实现的cross-correlation项:

D_2=\left \| T \right \| _2^2 +box(I\circ I,n)-2(F^{-1} F \left \{ I \right \}* \circ F\left \{ T \right \})

这三项是怎么来的呢,其实就是多项式展开。第一项只和模板T有关,与uv无关,所以在遍历寻找时只需要求解一次,复用来节约计算量。第二项可以使用盒子滤波,使用滑窗或者积分图快速实现。第三项其实就是cross-correlating,形状类似卷积/相关的形式,而频域相乘的逆过程就是相关,所以可以利用FFT快速实现。具体而言就是共轭转置与本身的频域点乘,经傅里叶逆变换。

这样的话可以快速得到偏移量,但是还是整数的,为了得到亚像素级别,基于估计得到的偏移量,在3x3的窗口上进行bivariate polynomial的拟合。具体做法是将D2用下面的形式近似表示:

D_2(u,v)\approx \frac{1}{2}\begin{bmatrix} u & v \end{bmatrix} A\begin{bmatrix} u\\ v \end{bmatrix} +b^T\begin{bmatrix} u\\ v \end{bmatrix}+c

假设A是PSD,这样D2的形状就会是向上的2次曲面,而不是鞍形或者向下的曲面。当定位到u^,v^是最小距离下的偏移量时,会以它为中心计算3x3范围内的D2的值。3x3内每个位置都应该满足二次方程,所以可以联立得到方程组,只不过方程会加以不同的权重,这个权重就是以距离中心距离的高斯权重。

得到的A很可能不是半正定的,这与假设相违背,所以我们的做法是强制使得A的对角元素取非负数,计算A的行列式,如果小于0,就使得off-diagonal元素等于0,这样就可以保证A是positive semi-definite。

如果估计出的最小亚像素位置和原来的u^,v^相差很远,那还是应该以整数的为准。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值