HDR详解
1.动态范围(Dynamic Range)
动态范围最早是信号系统的概念,一种信号系统的动态范围定义为:最大的信号不失真的电平和噪声电平的差,在实际场景中,多用分贝(dB)为单位来衡量一个信号系统的动态范围。
假设有一个系统,我们要关注其工作电压的动态范围,规定其动态范围的计算公式是,其中DR代表动态范围,单位为dB:
D
R
=
20
∗
l
o
g
10
(
V
m
a
x
V
m
i
n
)
DR=20*log_{10}(\frac{Vmax}{Vmin})
DR=20∗log10(VminVmax)
对于image sensor来说,动态范围的定义是最大不饱和光电流
I
m
a
x
I_{max}
Imax和最小可检测光电流
I
m
i
n
I_{min}
Imin的比值。对于一个使用井容量(Well Capacity)为固定值
Q
s
a
t
Q_{sat}
Qsat的sensor来说,这个值限制了最高的信号水平,最低的可检测信号则由sensor的读取噪声所决定。其DR公式为:
D
R
=
20
∗
l
o
g
10
(
I
m
a
x
I
m
i
n
)
DR=20*log_{10}(\frac{I_{max}}{I_{min}})
DR=20∗log10(IminImax)
2.HDR
HDR,高动态范围,全称High Dynamic Range。比Dynamic Range多 了一个high,这个“高”结合前文的动态范围来讲,在sensor这块主要是指提高了图像的亮度范围,能够让图像里的高光和阴影的范围更宽,这样就会让图像细节更加饱满。简单描述HDR就是(不准确,便于理解):HDR能让图像亮的地方和暗的地方的细节都展现出来。
对于Image sensor来说,根据动态范围的计算公式,硬件上最简单的提高动态范围的方法可以将ADC的转换精度提高。
但在现实场景中,提高sensor的位宽会导致一系列问题,比如带宽的要求更高,存储空间要求变大,整体成本会更高。于是工程师们开始想办法通过其他手段来提升sensor的动态范围。因此产生了一些sensor的HDR技术,能够在实现HDR同时尽量不增加太多成本。
3. 实现HDR的技术方法
前面提到了HDR的一些原理。下面来看一些具体实现HDR的技术,从最传统的时域多帧HDR来看起。
3.1时域多帧HDR
从名字里的“多帧”两个字可以大致猜出这种方法的原理,就是将拍摄多张图,然后进行“融合”。我们假设有三帧(实际上不一定非得是三帧)数据:短曝光时间帧,中曝光时间帧,长曝光时间帧。 拿到这三张图后,按照一定算法进行“融合”,一般采用下面的公式:
X
(
i
,
j
)
=
∑
k
=
1
K
W
(
i
j
,
k
)
X
k
(
i
,
j
)
X_{(i,j)}=\sum_{k=1}^{K}W_{(ij,k)}X_{k(i,j)}
X(i,j)=k=1∑KW(ij,k)Xk(i,j)
其中,
X
(
i
,
j
)
X_{(i,j)}
X(i,j)表示 坐标i,j处像素最终的值,
K
K
K代表总共K帧, W(ij,k)表示坐标在i,j处的像素在第k帧里的权重值,
X
k
(
i
,
j
)
X_{k(i,j)}
Xk(i,j)表示坐标在i,j处的像素在第k帧里的原始值。这种技术的大概运作流程如下图所示:
从上图可以看出,虽然这种方法最终合成的图能够将暗部和亮部的细节都呈现出来。但对于高速运动的物体(马),有严重的重影问题,马的腿部问题尤为明显,看起来马腿变成了螃蟹腿。同样,如果在拍摄时,如果因为手抖,导致图像中的物体位置发生了改变,也会产生鬼影。
在早期使用时域多帧HDR技术的设备中,为了解决手抖问题,会采用多帧防抖动算法,找出几幅图的特征点进行对齐,然后再做融合。对于高速运动的物体,选取出其中一张为主图,其它的图中选取相对稳定的部分进行融合。
Google的HDR+
传统的时域多帧HDR技术的特点是多张不同曝光程度的图融合为一张图片,我们假设上一节的三张图为例,拍摄三张图的时间会比较长(主要是过曝的图时间占比较大),在阴暗环境下尤其明显。Google提出了一种新的HDR+技术,通过融合多帧欠曝的图,通过一定算法降噪得到结果。
HDR+流水线流程如下图(谷歌白皮书):
HDR+技术有两个最重要的步骤:1. 做多个原始欠曝帧的对齐Aligning;2. 将多帧合并Merging,用来降噪。
对齐
对齐的目的主要是为了消除由于抖动引起的明显的模糊或鬼影,在合并操作前得到鲁棒性更好的数据帧。通常对齐原始数据帧会使用一个高斯金字塔来操作,高斯金字塔的每层的下采样因子是4,使用16*16个tile,搜索区域为4个像素,然后去查找使得L1距离和最小的tile偏移。Google使用了稍微不同的下采样因子和搜索区域大小,并且融合了L2和L1距离计算,像素级对齐方法基本相同。Google还加了一个子像素对齐的方法,这样就使得对齐的精度更细。来看一下效果:
为了解决鬼影问题,诞生了隔行曝光(Interlaced)HDR。采用这种技术的sensor,以行为单位,一组做长曝光,一组做短曝光,比如奇数组短曝光,偶数组长曝光(由于bayer阵列的结构,一般是两行为一组)。这样在一帧中就同时包含了长曝光和短曝光的行。算法最后会进行融合处理。其工作原理如下图:
iHDR会使得空间分辨率损失一半,主要的iHDR的技术有Sony的BME-HDR和OV的Alternate row HDR。
3.2.1 BME-HDR
采用这种技术的sensor,会按照每两行为一组,分别进行长曝光、短曝光。得到长、短曝光的数据后,进行融合,得到HDR图像。空间分辨率损失一半,就好像做了1x2 binning,因此叫做Binned Multiplexed Exposure。
OV的Alternate row HDR原理基本和Sony的BME-HDR类似,不再赘述。
3.2.2zHDR(Zig-zag HDR)
有多种排布长短曝光像素的布局可以达到zHDR的目的,就目前所知,SONY并没有公开具体的布局。上图是一种布局例子,在空间上Bayer阵列以4x4为单位,分别排布曝光时间长短不同的像素,上图中颜色的深浅表示了曝光时间的长短。这种布局声称能够获得单帧全分辨率HDR图像,只有约20%的空间分辨率损失(和SONY的SME-HDR所宣传能达到的)。
3.3QHDR(QB-HDR)
Quad HDR类型的sensor,相比于传统的bayer阵列,每一个像素(单色)划分为4个子像素,共用一个色彩滤波片。Quad Bayer结构如下图:
使用QHDR的sensor有两种模式:普通模式和HDR模式。普通模式下,只有一种曝光时间,标号1,2,3,4的子像素会binning到一起作为一个像素的值输出;HDR模式下,可以让子像素之间有不同的曝光时间,标号1,2,3,4的子像素值被用来做HDR合成。下图展示了某种Quad Bayer sensor两种模式之间的差异:
SONY和OV都有QHDR的方案,SONY的叫QBC(Quad Bayer Coding),OV叫4-cell (four-cell color-filter pattern HDR)
** QBC**
普通模式:像素1,2,3,4的值组合到一起作为一个大像素的输出值。
HDR模式:对角线上的像素1和4为一组,像素2和3为一组分别做长短曝光,然后将1和4的值,2和3的值分别融合作为大像素的长、短曝光下的值用来做HDR计算。可以参考图 - “Quad Bayer Sensor工作模式对比 ”。
** 4-cell**
工作方式和QBC类似,但它的HDR可以有两种不同的设置:
- 按对角线方式分成两组做不同的曝光,和QBC基本无差别
- 右下角像素曝光时间不同(像素1,2,3为一组,像素4为一组)
3.4行交织HDR(Line Interleaving HDR)
前面提到的iHDR,zHDR和QHDR等方法(不包括时域多帧HDR和HDR+),都属于单帧HDR,在一帧里包含亮部和暗部信息融合得到最终图像。单帧HDR相比于多帧HDR技术上相对简单,速度较快,但效果还是不如多帧HDR。时域多帧HDR和HDR+的计算量和能耗开销较大,硬件HDR有没有一种方法能够比较好地应对运动物体场景,同时又能节约计算资源和功耗呢?头部玩家SONY和OV等开始使用一种叫做行交织HDR的技术。
一般常见的CMOS sensor的快门都是滚动快门(也叫卷帘快门,Rolling Shutter),其读取像素数据时是从上至下一行行读取。
在传统的时域多帧HDR中,每一帧数据必须等到上一帧完成数据读取后才能开始。假设sensor先进行长曝光,再进行短曝光,那么短曝光的帧必须等到长曝光帧读取完成后再开始。
行交织HDR中,基本思想是,sensor读取完一行长曝光数据后,立即对这一行进行短曝光。每一行不同曝光时间的数据交错读取,因此节省了较多的等待时间。
传统多帧HDR和行交织HDR的对比如下图:
头部厂商SONY的实现方案为DOL-HDR(Digital Overlap HDR),OV实现方案为staggered HDR。
DOL-HDR
SONY推出的一种sensor多帧HDR技术,支持“准同时”输出多帧不同曝光时间的图像。
最多支持4:1曝光输出:long,medium,short,very short
考虑只有长、短曝光的情况,
E
x
p
o
s
u
r
e
R
a
t
i
o
=
T
l
o
n
g
T
s
h
o
r
t
ExposureRatio=\frac{T_{long}}{T_{short}}
ExposureRatio=TshortTlong, 曝光比和SNR drop相关,DOL的noise profile如下:
可以看到,曝光比越大,SNR drop就越大。SNR drop变得很大的时候,图像就会有明显的锐利边界出现,如下面两张示例图所示:
Staggered HDR
和DOL-HDR区别不大,但最多支持3:1输出:long,medium,short
3.5双增益(Dual Gain)
在CMOS感光元件中,我们可以通过配置其增益值(模拟增益和数字增益)来放大信号。一般相机都会有一个ISO(感光度)增益调节功能,能够调节ISO值来放大信号,但传统的相机在放大信号同时,噪声也一起放大了。
可不可以通过在不同曝光条件下使用不同增益改善信号质量,辅助实现HDR呢?答案是有的,目前sensor设计里有两种主要的双增益方法:一种在像素里做,叫做DCG(Dual Conversion Gain);一种在读出电路里做,叫做DGA(Dual Gain Amplifier)。
DCG(Dual Conversion Gain)
DCG是像素级的双增益方法,Dual这个单词将增益分出了两档:High Conversion Gain(HCG)和Low Conversion Gain(LCG)。
LCG应对于明亮的场景,DCG处于打开状态;HCG应对低光场景,DCG处于关闭状态,灵敏度增加。
要理解其原理,我们首先来看一个不带DCG的CMOS像素电路图
转换增益CG和满阱容量FWC关系
CG本身可以简单理解为电路探测到了一个电子后,转换表示为电压的单位,也就是对电子的敏感程度,CG越大,表示一个电子所能转换的电压就越高(不严谨,逻辑上这么理解即可,勿较真)。CG实际上是FD节点电容的一种“反向”表达方式。我们知道电容的公式是:C=Q/V。Q是电荷,V是电压。这意味着随着FD节点的电容增大,FD节点的CG就会减少(因此灵敏度也会下降)。通常来说,像素中所允许的电压摆幅(voltage swing)由整体的sensor设计所固定。这个固定的电压范围意味着CG会对sensor的FW产生显著的影响。
举个例子,假设像素的output处允许1V的电压摆幅,SF的增益是0.8。那么FD处所允许的电压摆幅就等于1V/0.8 = 1.25V。
如果FD的电压摆幅为1.25V,假设有一个sensor,它的CG=30uV/e,那么最大的FWC就等于1.25 * 10^6 uV / (30uV/e) 约为42000个电子;如果CG=150uV/e,那么FWC久等于1.25 * 10^6 / (150uV/e)约为8000个电子。
这个例子中,HCG sensor的CG=127uV/e,FW=10500 electrons;LCG sensor的CG=30.8uV/e,FW=42000 electros。两种情况下,FD处的最大电压变化量几乎相等,大约1.3V(只使用了信号响应曲线中线性变化的部分)。
从这幅图,我们可以看出,相同环境相同曝光情况下(可认为收集的电子数量基本相等),HCG的灵敏度更高,转换输出电压更高。在转换输出电压相同的情况下,LCG所收集的电子数更多。
CG,FWC和DR,SNR的关系
对于相同的图像场景和曝光量来说,更高的SNR对应更好的图像质量。我们用SNR_max来表示sensor的饱和曝光量N_max与整体(total)或暂态的(temporal)噪声( 单位以电子计量)的比值来表示最大信噪比,其公式是:
S
N
R
m
a
x
=
20
∗
l
o
g
10
(
N
m
a
x
/
n
)
SNR_{max}=20*log_{10}(N_{max}/n)
SNRmax=20∗log10(Nmax/n)
类似的,动态范围DR,我们用N_max比上读取噪声来表示,其公式是
D
R
=
20
∗
l
o
g
10
(
N
m
a
x
/
n
r
e
a
d
)
DR=20*log_{10}(N_{max}/n_{read})
DR=20∗log10(Nmax/nread)
一个更大的FW会增加N_max,因此SNR上限也会增大,同时也增加了sensor的整体动态范围,但增加CG会限制FW所能达到的上限。
动态响应像素技术
有了前面的知识,我们来真正看看使用DCG技术的像素电路。和传统的像素电路对比,最大的不同是红框处。这里增加了一个DCG开关。
当处于高光照环境时,DCG开关打开,连接FD和物理电容,FD节点电容变大,这时对应LCG模式。
当处于阴暗光照环境时,DCG关闭,断开FD和物理电容,这时对应HCG模式。这种情况下,灵敏度变高,读出噪声变小。
最后来看看实际效果:
首先看阴暗环境光照下,HCG和LCG的对比
然后来看明亮环境下,HCG和LCG的对比
DGA(Dual Gain Amplifier)
DGA实际电路中有两路放大器,上图是一个sCMOS的电路框图。目的和DCG类似,只是对于DCG方式来讲,如果没有特殊处理,一帧可以选择HCG,一帧选LCG;对DGA来说,可以做成一帧内同时读出HCG和LCG数据。