3. AE算法核心:测光模式、曝光补偿与收敛策略

自动曝光(AE)是3A算法里最基础、也最容易被忽视的一环。说白了,它要解决的就是一个问题:当前场景到底该用多少曝光量。我见过不少团队,AE调得马马虎虎,结果AWB和AF再怎么调也救不回来——底子没打好。

这一章,我们聚焦三个核心模块:测光模式、曝光补偿、收敛策略。它们共同决定了AE的“感知-决策-执行”链路。

3.1 测光模式:相机如何“看”场景

测光模式决定了传感器采集到的亮度数据如何被加权统计。不同的模式,本质上是不同的空间权重分布。

3.1.1 平均测光

最简单粗暴的方式。全画面每个像素的权重相同,直接取平均亮度作为场景亮度。

  • 适用场景:光照均匀的场景,比如阴天、室内均匀照明。
  • 缺点:一旦画面中有大面积亮区或暗区(比如逆光人像),平均测光就会翻车——背景过亮,人脸欠曝。
我的经验:在安防监控这类固定场景中,平均测光其实挺好用。因为画面内容变化不大,平均亮度能稳定反映环境光变化。但手机拍照就别用了,用户拍个逆光剪影,你给人家平均成灰蒙蒙一片,用户肯定骂娘。

3.1.2 中央重点测光

给画面中心区域更高的权重,边缘区域权重递减。这是早期相机最常用的模式,也是从胶片时代继承下来的思路——默认主体在画面中央。

  • 权重分布:通常中心60%-80%区域占主导,边缘贡献很小。
  • 适用场景:主体居中的肖像、静物拍摄。
  • 局限:主体一旦偏离中心,测光就偏了。

我记得有一次调试行车记录仪,默认用了中央重点测光。结果车辆转弯时,画面中心从路面切换到天空,曝光瞬间跳变,画面闪得厉害。后来改成了带空间平滑的加权模式才解决。

3.1.3 点测光

只取画面中一个极小区域(通常1%-5%)的亮度作为曝光依据。这是最“极端”的测光方式。

  • 适用场景:舞台追光、逆光人像(对人脸点测)、高反差艺术摄影。
  • 风险:测光点选错,整个画面就废了。
避坑指南:我曾经在手机HDR流水线上遇到过一个问题——点测光模式下,AE收敛速度极慢。原因是点测区域太小,亮度信号噪声大,导致统计值抖动剧烈。后来加了时域滤波才稳住。如果你要用点测光,务必在统计链路里做降噪处理。

3.1.4 三种模式对比

测光模式 权重分布 典型场景 抗干扰能力 实现复杂度
平均测光 全画面均匀 均匀光照 低 低
中央重点 中心高、边缘低 居中主体 中 中
点测光 极小区域 高反差、追光 高(但依赖选点) 中

3.2 曝光补偿:给AE一个“偏移量”

测光模式算出来的亮度,不一定是你想要的。比如拍雪景,自动曝光会把雪拍成灰色——因为AE认为平均亮度应该是18%灰。这时候就需要曝光补偿。

曝光补偿的本质是:在AE计算出的目标亮度上,叠加一个用户或算法指定的偏移量。

  • 单位:EV(Exposure Value),1 EV 对应亮度翻倍或减半。
  • 范围:通常 -3 EV 到 +3 EV,步长 1/3 EV。
  • 实现方式:直接修改AE的目标亮度值,或者调整曝光时间/增益/光圈三者的组合。
关键点:曝光补偿不是简单的“加亮”或“减暗”。它改变了AE的收敛目标。补偿 +1 EV,意味着AE会努力让画面亮度比“标准”亮一倍。如果场景本身已经过曝,再补偿 +1 EV 只会更糟——所以补偿要结合场景理解。

我习惯把曝光补偿分为两类:

  1. 用户手动补偿:用户通过UI滑动条调整,直接写入AE参数。
  2. 算法自动补偿:比如人脸检测到背光时,算法自动加 +0.7 EV 到 +1.0 EV。这个在手机端很常见。

3.3 AE收敛策略:从“当前值”到“目标值”的路径

测光模式给出了“目标亮度”,曝光补偿修正了它。接下来AE要做的,就是让实际亮度收敛到这个目标值。怎么收敛?这就是策略问题。

3.3.1 收敛的本质

AE收敛是一个闭环控制过程:

  1. 采集当前帧的亮度统计值。
  2. 与目标亮度比较,计算误差。
  3. 根据误差调整曝光参数(曝光时间、模拟增益、数字增益、光圈)。
  4. 下一帧重复。

说白了,就是一个PID控制器——只不过被控对象是曝光参数,反馈量是画面亮度。

3.3.2 常见的收敛策略

策略 原理 优点 缺点
一步到位 根据误差直接计算目标参数 收敛快 容易过冲、振荡
渐进式 每次只调整一小步 稳定、平滑 收敛慢
混合式 大误差时一步到位,小误差时渐进 兼顾速度和稳定 实现复杂

我个人最推荐混合式。原因很简单:用户从暗室走到阳光下,你如果渐进式慢慢调,画面要花好几秒才亮起来,用户早就不耐烦了。但如果在稳定光照下频繁微调,一步到位又会导致画面闪烁。

3.3.3 收敛速度与平滑度的权衡

这里有个绕不开的矛盾:收敛快 = 容易闪,收敛慢 = 反应迟钝。

  • 帧间跳变限制:限制每帧曝光参数的最大变化量。比如曝光时间每次最多变化 30%。
  • 时域滤波:对亮度统计值或目标参数做低通滤波。我常用一阶IIR,系数 0.3~0.5。
  • 死区控制:误差小于某个阈值时,不调整参数。避免在目标值附近来回振荡。
我曾经踩过的坑:在某个IPC项目中,AE收敛策略用了纯PID,没加死区控制。结果在室内日光灯下,画面亮度以50Hz的频率轻微闪烁——因为日光灯本身有100Hz的频闪,AE的统计值跟着抖,PID又去追这个抖动,形成了正反馈。后来加了死区和50Hz陷波滤波才解决。

3.4 核心流程图:AE算法链路

下面这张图把测光、补偿、收敛串起来了。你可以看到数据是怎么从传感器一路流到曝光参数更新的。

AE算法核心链路 AE算法核心链路 图像传感器 亮度统计(测光模式加权) 误差 = 目标亮度 - 实际亮度 收敛策略(混合式/PID) 更新曝光参数(时间/增益) 反馈(下一帧) 曝光补偿在“目标亮度”处叠加偏移量,影响误差计算环节 测光模式决定“实际亮度”的统计加权方式

3.5 工程落地中的几个关键细节

理论说完了,聊点实际的。AE在嵌入式平台上落地,有几个坑是绕不开的。

3.5.1 曝光参数的优先级与切换

曝光时间、模拟增益、数字增益,这三者的调节优先级直接影响画质。

  • 优先调曝光时间:保证信噪比,但要注意运动模糊。快门太慢,运动物体就糊了。
  • 再调模拟增益:模拟增益放大的是传感器原始信号,噪声相对可控。
  • 最后调数字增益:数字增益放大的是量化后的信号,噪声会被一起放大。能不用就不用。

我习惯设定一个曝光时间上限(比如 30ms,对应 33fps 的帧率上限)。超过这个上限还没达到目标亮度,才开始拉模拟增益。模拟增益到上限(通常 8x~16x),再拉数字增益。

3.5.2 场景切换检测

AE最怕的不是慢,而是不该动的时候乱动。比如用户拿着手机从室内走到窗边,AE应该快速响应。但如果只是画面中有人走动,AE不应该跟着跳。

解决方案:

  1. 亮度变化幅度检测:连续多帧的亮度变化超过阈值,才认为是场景切换。
  2. 直方图变化检测:比平均亮度更鲁棒。直方图分布变了,才是真正的场景变化。
  3. 运动检测辅助:如果画面中有大量运动,AE暂时冻结,避免追着运动物体调曝光。
小技巧:在场景切换检测中,我常用“亮度直方图的巴氏距离”作为判据。比单纯比平均亮度稳定得多。代码实现也不复杂,几十行C就够了。

3.5.3 收敛速度的自适应

前面说了混合式策略。具体实现时,我习惯这样分档:

误差范围 收敛步长 行为描述
|误差| > 2 EV 一步到位 直接计算目标参数,快速响应大变化
1 EV < |误差| ≤ 2 EV 大步长(50%/帧) 快速逼近,但不过冲
0.3 EV < |误差| ≤ 1 EV 小步长(20%/帧) 精细调节,避免振荡
|误差| ≤ 0.3 EV 不调整(死区) 稳定状态,不做无谓调节

这个分档不是固定的。你想想看,不同场景对收敛速度的要求不一样——视频会议可以慢一点,但运动相机必须快。所以这些阈值最好做成可配置的,甚至根据场景自动切换。

3.6 小结

AE的核心就三件事:怎么测光、怎么补偿、怎么收敛。测光模式决定了AE“看”什么,曝光补偿告诉AE“要什么”,收敛策略决定了AE“怎么去”。三者缺一不可。

在实际工程中,AE的调优往往是一个反复试错的过程。没有一套参数能通吃所有场景。我的建议是:先把基础链路跑通,然后用大量真实场景数据去调参,最后加上场景自适应逻辑。别指望一次搞定——AE的调优,说白了就是跟光照较劲。