2、AE算法核心指标:目标亮度、AE收敛速度、AE稳定性、AE闪烁抑制、AE权重分布

做AE算法,说白了就是跟这几个指标打交道。我刚开始接触3A时,总觉得把画面调亮调暗就行了。后来踩了不少坑才明白——真正决定AE算法好坏的,就是这五个核心指标。今天咱们一个一个掰开聊。

2.1 目标亮度(Target Luminance)

目标亮度,就是你想让画面最终呈现多亮。这不是拍脑袋定的,得结合场景、传感器特性和用户偏好来设。

我个人习惯把目标亮度拆成两层:

  • 全局目标亮度:整帧画面的平均亮度期望值。通常用Y通道的均值或中值来表示。
  • 区域目标亮度:针对ROI(感兴趣区域)的亮度期望。比如人脸区域要保持在18%灰附近。

举个例子,我在做手机摄像头项目时,遇到过一个问题:夜景模式下用户觉得画面太暗,但自动模式又觉得过曝。后来发现是目标亮度曲线没调好——不同ISO下,目标亮度应该动态变化才对。

核心公式(简化版):

Target_Y = Base_Y * ISO_Gain(iso) * Scene_Offset(scene_mode)

Base_Y是基准亮度(通常64-128之间),ISO_Gain根据当前ISO做补偿,Scene_Offset针对不同场景微调。

我的经验:目标亮度不要设死。给个范围,比如±10%的容忍窗口。这样AE在边界场景下不会频繁跳变。

2.2 AE收敛速度(Convergence Speed)

收敛速度,就是AE从当前亮度调整到目标亮度需要多少帧。太快了画面会抖,太慢了用户觉得卡。

这里有个矛盾点——你想想看,如果场景突然从室内切到室外,亮度差了几百倍。AE如果一步到位,画面会像闪光灯一样闪一下。如果慢慢调,用户又觉得反应迟钝。

我建议的做法是分阶段控制:

  1. 粗调阶段:前3-5帧,大步调整。用指数平滑,步长可以设到目标差值的30%-50%。
  2. 精调阶段:接近目标后,步长缩小到5%-10%。避免过冲。
  3. 锁定阶段:进入目标窗口后,只做微调,步长1%-3%。
阶段 帧数范围 步长比例 适用场景
粗调 1-5帧 30%-50% 大跨度场景切换
精调 6-15帧 5%-10% 接近目标亮度
锁定 16帧以后 1%-3% 稳定场景

注意:收敛速度不能只看帧数,还得考虑帧率。30fps和60fps下,同样的帧数对应的时间差一倍。我习惯用时间(毫秒)来控制,而不是帧数。

2.3 AE稳定性(Stability)

稳定性,说白了就是画面不抖。你调好亮度后,画面不能忽明忽暗地来回跳。

为什么会不稳定?最常见的原因是噪声。传感器噪声会导致每一帧的统计值有波动,AE如果对这些波动太敏感,就会来回调整。

我踩过的一个坑:有一次做行车记录仪,白天画面稳定,但到了黄昏就开始闪烁。查了半天,发现是低照度下噪声放大后,AE的统计窗口太小,导致每帧的亮度估计值跳来跳去。

解决方案有三个:

  • 时域滤波:对亮度统计值做IIR滤波,系数0.7-0.9。说白了就是让当前帧的统计值参考前几帧的结果。
  • 滞回比较:设定一个死区(dead zone),亮度在死区内波动时不触发调整。死区大小通常设为目标亮度的±2%-5%。
  • 帧间平滑:调整曝光参数时,不要一步到位,而是用插值的方式渐变过去。

稳定性检查清单:

  • 统计值是否做了时域滤波?
  • 是否有滞回死区?
  • 曝光参数变化是否平滑?
  • 低照度场景下是否降低了AE响应速度?

2.4 AE闪烁抑制(Flicker Suppression)

闪烁,是AE算法里最头疼的问题之一。尤其是室内场景,50Hz/60Hz的灯光会让画面一帧亮一帧暗。

我记得第一次遇到这个问题是在一个安防项目里。客户反馈说画面像呼吸灯一样,一明一暗。我一开始以为是AE收敛太快,调慢了步长,结果没用。后来才发现是电源频率的锅。

闪烁的根源:

  • 50Hz灯光(欧洲/中国):周期20ms,每10ms一个半周期
  • 60Hz灯光(美国/日本):周期16.67ms,每8.33ms一个半周期

如果曝光时间不是半周期的整数倍,就会采集到不同亮度的光能量,导致帧间亮度波动。

解决方案:

  1. 曝光时间锁定:强制曝光时间为半周期的整数倍。比如50Hz下,曝光时间设为10ms、20ms、30ms……
  2. 频率检测:自动检测当前环境是50Hz还是60Hz。我习惯在AE初始化时做一次快速扫描,统计亮度波动的频率。
  3. 抗闪烁滤波:如果无法锁定曝光时间,至少对亮度统计值做带阻滤波,滤除50Hz/60Hz的波动分量。

实战技巧:有些场景下,曝光时间锁定会影响帧率。比如30fps下,帧周期33.33ms,如果锁定到20ms(50Hz的2个半周期),剩余13.33ms可能不够传感器读出。这时候需要权衡——是牺牲一点帧率,还是容忍轻微闪烁?我一般优先保证不闪烁。

2.5 AE权重分布(Weight Distribution)

权重分布,就是告诉AE算法:画面里哪些区域更重要,应该优先保证这些区域的亮度准确。

你想想看,拍人像时人脸最重要,拍风景时天空和地面都要兼顾。如果全图平均,人脸很容易过曝或欠曝。

常见的权重分布模式:

模式 权重策略 适用场景
中心权重 画面中心区域权重高,边缘低 人像、主体在中央
人脸权重 检测到人脸的区域权重极高 自拍、视频通话
平均权重 所有区域权重相同 风景、全景
自定义权重 用户点击对焦/测光区域权重高 专业模式、手动控制

我在项目中常用的做法是:把画面分成5x5或7x7的网格,每个格子分配一个权重值。权重值范围0-1,总和归一化到1。然后计算加权平均亮度。

// 伪代码:加权平均亮度计算
float weighted_sum = 0.0f;
float weight_sum = 0.0f;
for (int i = 0; i < grid_rows; i++) {
    for (int j = 0; j < grid_cols; j++) {
        weighted_sum += grid_brightness[i][j] * weight_map[i][j];
        weight_sum += weight_map[i][j];
    }
}
float target_luminance = weighted_sum / weight_sum;

注意:权重分布不能太极端。如果人脸区域权重设到0.9,背景几乎不考虑,那背景就会完全过曝或欠曝。我一般把最大权重控制在0.5-0.7之间,留一些余量给背景。

2.6 五个指标的关系

这五个指标不是孤立的。它们互相影响,牵一发而动全身。

举个例子:你把收敛速度调快了,稳定性就会下降。你把权重集中在人脸区域,背景的亮度就可能失控。你为了抑制闪烁锁定了曝光时间,收敛速度可能就变慢了。

下面这张图是我自己总结的AE核心指标关系图,帮你理清思路:

AE核心指标关系图 AE算法核心 目标亮度 收敛速度 稳定性 闪烁抑制 权重分布 相互制约关系: 收敛速度 ↑ → 稳定性 ↓ 闪烁抑制 ↑ → 收敛速度 ↓

所以,做AE算法本质上是在做平衡。没有完美的参数,只有适合场景的配置。我一般会先确定目标亮度和权重分布(这两个是需求层面的),然后调收敛速度和稳定性(这两个是响应层面的),最后用闪烁抑制来兜底。