4、多增益读出技术:双增益/多增益架构、高低增益融合、HDR合成算法
各位同学,今天我们来聊聊动态范围提升技术里,我个人觉得最实用、也最“接地气”的一个方向——多增益读出技术。
说白了,就是让传感器同时或分时拍两张“曝光程度”不同的照片,一张亮部不过曝,一张暗部有细节,然后通过算法把它们合成一张高动态范围的图像。这个思路听起来简单,但落地的时候,坑可不少。我当年在调试第一颗双增益芯片时,就吃过不少苦头。
4.1 双增益架构:一个像素,两条路
先看最基本的双增益架构。它的核心思想是:同一个像素,在同一个曝光周期内,读出两个不同增益的信号。
怎么做到的呢?
嗯,这里要引入一个概念——条件复位。像素在曝光结束后,先读一次信号(高增益,对应暗部细节),然后对浮置扩散节点(FD)做一个部分复位,再读一次(低增益,对应亮部细节)。
我习惯把这种结构叫做“一像素两读出”。它的好处很明显:
- 时间对齐:两个信号来自同一时刻,没有运动伪影。
- 硬件开销小:只需要在列级ADC前增加一条低增益路径。
但代价呢?
4.2 多增益架构:不止两条路
双增益能提升大约2-3倍的动态范围(约6-10dB)。但如果你想要更高的动态范围,比如120dB以上,那就得考虑多增益架构了。
多增益架构,说白了就是双增益的“升级版”。它通常采用分时曝光的方式:
- 第一帧:短曝光 + 高增益(捕捉亮部)
- 第二帧:长曝光 + 低增益(捕捉暗部)
- 第三帧:超长曝光 + 超高增益(捕捉极暗部)
你想想看,这样三帧合成,动态范围是不是就上去了?
但这里有个大坑——运动物体。因为三帧不是同时拍的,如果场景里有快速移动的物体,合成后就会出现“鬼影”。
4.3 高低增益融合:算法才是灵魂
架构定下来了,接下来就是怎么把高低增益的信号“融合”到一起。这部分,我建议你把它当成一个权重分配问题。
最简单的做法是:
- 设定一个阈值(比如ADC输出码的80%)。
- 低于阈值的像素,用高增益信号。
- 高于阈值的像素,用低增益信号。
- 在阈值附近,做一个线性过渡。
代码实现起来大概是这样:
// 伪代码:双增益融合
for each pixel (x, y):
high = read_high_gain(x, y)
low = read_low_gain(x, y)
// 将低增益信号缩放到与高增益相同的量纲
low_scaled = low * gain_ratio
if high < threshold:
output = high
else if low_scaled > saturation:
output = low_scaled
else:
// 线性过渡
alpha = (high - threshold) / (saturation - threshold)
output = (1 - alpha) * high + alpha * low_scaled
这个算法看起来简单,但实际调参的时候,你会发现阈值和过渡区宽度非常敏感。调得太窄,融合处会出现明显的“接缝”;调得太宽,又会损失动态范围。
4.4 HDR合成算法:从融合到合成
如果说高低增益融合是“像素级”的操作,那HDR合成算法就是“图像级”的工程。它不仅要处理增益切换,还要处理运动补偿、去鬼影、色调映射等一系列问题。
我见过很多团队,在传感器端把动态范围做到了120dB,但一经过HDR合成算法,实际能看到的动态范围只剩下80dB。为什么?因为算法把暗部噪声放大了,或者把亮部细节压没了。
这里我分享一个我常用的HDR合成流程:
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 对齐 | 对多帧图像进行全局/局部运动估计,消除位移 |
| 2 | 去鬼影 | 检测运动区域,对运动像素只使用单帧数据 |
| 3 | 权重融合 | 根据像素的“可信度”(如曝光是否饱和、噪声水平)分配权重 |
| 4 | 色调映射 | 将高动态范围的线性数据,映射到8bit或10bit的显示空间 |
其中,去鬼影是最难的一步。我曾经在一个监控项目中,因为去鬼影算法没做好,导致夜间路灯下的行人出现了“半透明”的拖影。后来我们改用基于光流的运动补偿,才勉强过关。
4.5 知识体系总览
为了让你更直观地理解这一章的内容,我画了一张流程图,把多增益读出技术的核心逻辑串起来:
从这张图你可以看到,整个技术链条是从硬件架构出发,经过融合算法的中间层,最终落到合成算法的工程实现上。任何一个环节出了问题,最终图像质量都会大打折扣。
好了,这一章的内容就到这里。多增益读出技术,说白了就是“硬件多留一手,软件多算一步”。你只要记住这个核心思想,后面遇到具体实现时,就不会跑偏。
公众号:蓝海资料掘金营,微信deep3321