004、模拟增益与数字增益:增益分配策略对信噪比和图像质量的实战影响
2026/7/11 17:44:54
网站开发
004、模拟增益与数字增益增益分配策略对信噪比和图像质量的实战影响一个让我熬夜三天的bug2018年某款旗舰机的前置摄像头暗光自拍噪点像雪花一样。ISP团队说sensor输出已经调到最大模拟增益了再往上加就是数字增益。我盯着log看了三个小时发现一个诡异现象ISO 3200时画面噪点反而比ISO 1600干净。这不是反常识吗后来扒开sensor的datasheet才发现这家sensor厂商在ISO 3200对应的寄存器配置里偷偷把模拟增益上限卡在了24dB剩下的6dB用数字增益补。而ISO 1600是纯模拟增益30dB。模拟增益和数字增益的分配从来不是简单的数学题它直接决定了你拍出来的是一张可用的照片还是一堆彩色噪点。模拟增益sensor的原始力量模拟增益发生在sensor的像素阵列读出阶段在ADC转换之前。它的本质是把每个像素积累的电荷信号进行电压放大。这个放大器的物理位置就在像素列读出电路上离感光区域非常近。信噪比优势模拟增益放大的是信号噪声的混合体但关键点在于——它放大的信号幅度远大于sensor读出噪声的幅度。假设sensor的读出噪声是2个电子信号是100个电子施加6dB2倍模拟增益后信号变成200电子读出噪声仍然是2个电子因为读出噪声在增益之后才叠加。信噪比从100:250提升到200:2100。这就是模拟增益不显著恶化信噪比的物理原因。实战限制模拟增益不是无限可加的。每个sensor都有模拟增益的上限通常在24dB到36dB之间对应ISO 100到1600左右。超过这个上限sensor的模拟放大器会进入非线性区出现饱和、条纹、固定模式噪声。我见过某国产sensor在36dB时出现明显的竖条纹就是模拟放大器供电纹波被放大了。这里踩过坑别以为sensor datasheet上写的最大模拟增益48dB就能用实际测试时36dB以上画质就开始崩了datasheet写的是电气极限值不是画质可用值。数字增益ISP里的双刃剑数字增益发生在ISP的RGB域或YUV域是对已经数字化的图像数据进行乘法运算。它的实现方式很简单每个像素值乘以一个系数。信噪比灾难数字增益放大的是已经包含所有噪声的数字信号。sensor的读出噪声、ADC量化噪声、暗电流噪声所有这些在数字域里已经固定了。乘以2倍增益信号和噪声同时乘以2信噪比不变。但问题在于数字增益会放大量化噪声和ADC的非线性误差。12bit ADC的量化步长是1/4096乘以4倍数字增益后量化步长变成4/4096原本平滑的渐变区域会出现明显的色阶断层。别这样写代码pixel pixel * gain_factor直接乘会丢失暗部细节应该用查表法做gamma校正前的数字增益。一个容易被忽视的问题数字增益会改变噪声的统计分布特性。模拟增益后的噪声是高斯分布的经过数字增益后仍然是高斯分布。但数字增益配合后面的去噪算法时会产生奇怪的伪影。我调试过一款手机暗光下开启数字增益后天空区域出现规则的网格状噪点查了三天发现是数字增益放大了sensor的列固定模式噪声而ISP的2D去噪算法对这种周期性噪声束手无策。增益分配策略实战中的博弈策略一模拟增益优先数字增益兜底这是最经典的策略。在暗光场景下优先把模拟增益推到sensor的可用上限注意不是datasheet上限剩下的曝光不足部分用数字增益补。这个策略的理论依据是模拟增益不恶化信噪比数字增益只是维持信噪比不变。但实战中有一个陷阱模拟增益推到极限时sensor的暗电流噪声也会被放大导致暗部出现发紫或发红的偏色。我通常的做法是给模拟增益留3dB的余量比如sensor最大可用模拟增益是30dB我只推到27dB剩下的用数字增益补。这样暗部偏色问题明显改善。策略二模拟增益和数字增益混合分配这个策略适用于对动态范围有要求的场景。比如HDR合成时长帧用高模拟增益保证暗部信噪比短帧用低模拟增益保留高光细节。但混合分配最头疼的问题是增益切换时的帧间一致性。我遇到过的情况长帧模拟增益24dB短帧模拟增益6dB合成后的HDR图像在过渡区域出现明显的亮度跳变。原因是两个帧的模拟增益不同导致sensor的响应曲线斜率不同。解决方案是在ISP里做增益归一化把短帧的像素值乘以一个补偿系数但这个系数不是简单的增益比值还要考虑sensor的光电响应非线性。策略三动态增益分配这是高端旗舰机用的策略根据场景内容实时调整增益分配。比如拍摄夜景时如果画面中有大量暗部区域就提高模拟增益占比如果画面中有高亮光源就降低模拟增益避免饱和。动态分配的核心是场景分析算法需要实时计算当前帧的直方图分布和局部对比度。我参与过一个项目动态增益分配算法上线后暗光场景的SNR提升了2.3dB但代价是功耗增加了15%。别这样写在每一帧都做全图直方图统计太耗电了应该用硬件加速的统计模块或者隔帧采样。实战中的三个坑坑一增益切换的瞬态效应模拟增益切换不是瞬间完成的sensor内部有建立时间。如果增益切换发生在帧曝光期间会导致这一帧出现亮度不均匀。我调试过一款sensor从6dB切换到12dB需要4行像素的建立时间结果画面顶部4行明显偏暗。解决方案是在帧消隐期切换增益或者干脆在帧与帧之间切换牺牲一帧的连续性。坑二数字增益的位宽溢出12bit ADC输出的最大值是4095如果数字增益系数是2.0理论上最大值变成8190但ISP的RGB域通常只有12bit或14bit位宽。直接截断会导致高光区域出现饱和白斑。正确的做法是使用16bit内部位宽做数字增益或者采用浮点运算。这里踩过坑某次为了省带宽用了12bit定点乘法结果高光区域全部变成纯白丢失了云层的纹理细节。坑三增益与去噪的协同高增益必然带来高噪声但去噪算法不是万能的。模拟增益高时噪声主要是高斯白噪声2D去噪效果好。数字增益高时噪声中混入了量化噪声和列固定模式噪声需要3D去噪或多帧降噪。我总结的经验是模拟增益超过24dB时必须开启3D去噪数字增益超过6dB时必须做多帧合成。否则噪点会像砂纸一样粗糙。我的经验性建议永远不要相信sensor datasheet上的最大模拟增益。拿到新sensor后第一件事就是做增益扫描测试从最低增益开始每3dB拍一张灰阶卡观察暗部噪声和亮部饱和。找到画质可接受的增益上限这个值通常比datasheet低6dB到12dB。数字增益不要超过6dB。超过6dB的数字增益量化噪声会变得肉眼可见。如果暗光下需要超过6dB的数字增益说明曝光时间或光圈已经到极限了应该考虑多帧合成或闪光灯。增益分配要跟AE算法联动。AE算法不能只看亮度目标值还要考虑当前增益分配下的信噪比。我习惯在AE算法里加一个“信噪比预算”的概念模拟增益每增加3dB信噪比预算减少0.5dB数字增益每增加3dB信噪比预算减少2dB。当信噪比预算低于阈值时强制降低增益并增加曝光时间。不同sensor的增益特性差异巨大。索尼IMX系列的模拟增益线性度好推到30dB画质依然可用。三星ISOCELL系列的模拟增益在24dB以上时暗电流噪声明显增大。国产sensor如OV系列模拟增益的温漂问题严重低温下增益偏小高温下增益偏大。调试时一定要针对具体sensor做增益校准表。最后的忠告增益分配不是孤立的问题。它跟曝光时间、光圈、去噪强度、HDR策略都耦合在一起。不要试图用一个固定的增益分配表解决所有场景应该根据场景光照条件、运动状态、用户偏好动态调整。我见过太多工程师把增益分配写死在代码里结果暗光场景噪点爆炸高光场景过曝。灵活才是增益分配的灵魂。