AE策略与收敛:目标亮度设定、步长控制、防闪烁策略

自动曝光(AE)这东西,说白了就是让摄像头在不同光照下都能拍出亮度合适的画面。我刚开始做ISP的时候,觉得AE不就是调个曝光时间嘛,后来发现远没那么简单——目标亮度怎么定?步长多大才不抖?遇到50Hz的灯光怎么不闪?这里头门道不少。

今天咱们就把AE策略的核心拆开聊。我个人习惯把AE分成三个层次:先定目标,再控收敛,最后处理闪烁。一层层来,你就能理解为什么有些摄像头画面稳如老狗,有些却忽明忽暗。

目标亮度设定:不是越亮越好

目标亮度,就是AE想达到的画面平均亮度。很多人觉得目标亮度设高一点画面更亮更好看,其实这是个误区。

注意:目标亮度设太高,暗部噪声会被放大,亮部容易过曝。设太低,画面又太暗,细节丢失。这个平衡点需要根据场景和传感器特性来调。

我在项目中遇到过这样一个案例:某款安防摄像头,白天效果很好,一到晚上画面就发白。查了半天,发现是目标亮度设得太高,AE在低照度下拼命拉增益,结果噪声全出来了。后来把目标亮度从180降到120(8bit),画面反而干净多了。

目标亮度的设定通常参考以下几个因素:

  • 传感器动态范围:宽动态传感器可以设高一点,普通传感器要保守些
  • 场景类型:室内场景一般120-160,室外可以160-200(8bit范围)
  • 噪声水平:传感器噪声大,目标亮度要适当降低
  • 用户偏好:有些客户喜欢亮一点,有些喜欢自然一点

实际工程中,我一般用这个公式做初始设定:

target_luminance = (max_luminance - min_luminance) * 0.6 + min_luminance

嗯,这里要注意,这个0.6不是固定的。对于低照度场景,我会降到0.4左右,避免增益过高。

步长控制:收敛速度与稳定性的博弈

步长控制是AE的核心。步长太大,画面会来回震荡;步长太小,收敛又太慢。你想想看,用户拿着手机从室内走到室外,如果AE半天反应不过来,那体验得多糟糕。

我习惯把步长控制分成三个阶段:

阶段 误差范围 步长策略 特点
粗调 误差 > 30% 大步长(50-100ms) 快速接近目标
细调 10% < 误差 ≤ 30% 中步长(10-50ms) 平滑过渡
微调 误差 ≤ 10% 小步长(1-10ms) 稳定锁定

步长控制的核心公式是这样的:

exposure_delta = (target_luminance - current_luminance) * gain_factor
new_exposure = current_exposure + exposure_delta

这里的gain_factor就是步长系数。粗调阶段我设0.8,细调阶段0.3,微调阶段0.1。为什么要这样?因为误差大的时候,我们需要快速响应;误差小的时候,要防止过冲。

经验之谈:我曾经在某个项目中,步长系数设得太大,结果AE在目标值附近来回震荡,画面像呼吸一样忽明忽暗。后来加了死区(dead zone)处理——当误差小于5%时,直接不调整,问题就解决了。

还有一个细节:曝光时间、模拟增益、数字增益的调整顺序。我的做法是:

  1. 先调曝光时间,直到达到上限(比如33ms对应30fps)
  2. 再调模拟增益,直到达到上限(通常6-12dB)
  3. 最后调数字增益,但尽量少用,因为数字增益会放大噪声

这个顺序能保证在低照度下优先利用曝光时间,而不是盲目拉增益。

防闪烁策略:跟电网频率较劲

防闪烁,说白了就是避免画面出现明暗条纹。为什么会这样?因为灯光(尤其是荧光灯和LED灯)会以电网频率的两倍闪烁——50Hz电网就是100Hz闪烁,60Hz电网就是120Hz闪烁。

如果曝光时间不是闪烁周期的整数倍,画面就会出现亮度条纹。我见过最夸张的一次,整个画面像斑马线一样,用户直接投诉说摄像头坏了。

防闪烁的核心策略有两个:

  • 固定曝光时间法:将曝光时间锁定为闪烁周期的整数倍。比如50Hz下,闪烁周期是10ms,曝光时间就设为10ms、20ms、30ms...
  • 自动检测法:通过分析画面亮度波动,自动判断闪烁频率,然后调整曝光时间

实际项目中,我一般用这种策略:

if (flicker_detected) {
    if (power_freq == 50Hz) {
        exposure_time = round_to_nearest(exposure_time, 10ms);
    } else if (power_freq == 60Hz) {
        exposure_time = round_to_nearest(exposure_time, 8.33ms);
    }
}

这里有个坑——曝光时间被锁定后,AE的调节范围就受限了。比如50Hz下,曝光时间只能以10ms为步长调整,那在低照度场景下,可能从10ms直接跳到20ms,画面亮度变化会很明显。

避坑指南:我曾经在一个项目中,防闪烁功能开启后,AE在低照度下收敛特别慢。后来发现是曝光时间步长太大,导致亮度跳跃。解决方案是:在防闪烁模式下,配合模拟增益做细调,让曝光时间保持整数倍,增益来做平滑过渡。

AE收敛的整体流程

把上面这些串起来,AE收敛的完整流程是这样的:

AE收敛整体流程 获取当前帧亮度 计算亮度误差 判断误差范围 粗调:大步长 细调:中步长 微调:小步长 防闪烁处理 更新曝光参数 循环迭代

这个流程看起来简单,但实际工程中要考虑的细节很多。比如:

  • 亮度统计区域的选择——中心权重还是全局平均?
  • 场景切换检测——突然从暗到亮,要不要重置AE状态?
  • 与AWB的交互——色温变化会影响亮度统计吗?
核心要点:AE不是简单的PID控制,它需要结合场景理解、传感器特性和用户体验来做综合决策。目标亮度、步长控制、防闪烁这三个维度,任何一个没做好,画面质量都会大打折扣。

嗯,最后说一句。AE调优是个细致活,没有万能参数。我每次拿到新传感器,都会花至少一周时间专门调AE。先固定场景调收敛,再换各种光照条件测稳定性,最后才做防闪烁验证。这个过程急不来,但一旦调好了,后面就省心了。