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如果一步到位,画面会像闪光灯一样闪一下。如果慢慢调,用户又觉得反应迟钝。
我建议的做法是分阶段控制:
- 粗调阶段:前3-5帧,大步调整。用指数平滑,步长可以设到目标差值的30%-50%。
- 精调阶段:接近目标后,步长缩小到5%-10%。避免过冲。
- 锁定阶段:进入目标窗口后,只做微调,步长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一个半周期
如果曝光时间不是半周期的整数倍,就会采集到不同亮度的光能量,导致帧间亮度波动。
解决方案:
- 曝光时间锁定:强制曝光时间为半周期的整数倍。比如50Hz下,曝光时间设为10ms、20ms、30ms……
- 频率检测:自动检测当前环境是50Hz还是60Hz。我习惯在AE初始化时做一次快速扫描,统计亮度波动的频率。
- 抗闪烁滤波:如果无法锁定曝光时间,至少对亮度统计值做带阻滤波,滤除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算法本质上是在做平衡。没有完美的参数,只有适合场景的配置。我一般会先确定目标亮度和权重分布(这两个是需求层面的),然后调收敛速度和稳定性(这两个是响应层面的),最后用闪烁抑制来兜底。