3、AE算法核心逻辑:统计信息采集、亮度目标设定、曝光调整策略
AE(自动曝光)说白了,就是让摄像头自己找到那个「不亮不暗刚刚好」的曝光点。很多刚入行的朋友觉得AE就是调个目标亮度值,其实没那么简单。我做了这么多年ISP,踩过的坑大多都跟AE的三个核心环节有关:统计信息怎么采、目标亮度怎么定、曝光怎么调。今天咱们就把这三个环节掰开揉碎了讲。
3.1 统计信息采集:AE的「眼睛」
AE算法第一步,得知道当前画面到底有多亮。这个信息从哪来?从硬件统计模块来。RK平台内部有一个专门的统计引擎,叫AE统计模块(AE Statistic)。
它会做这么几件事:
- 把整帧图像分成M×N个网格(比如15×15或32×32)
- 对每个网格计算亮度统计值(通常是Y分量均值)
- 同时统计直方图信息(亮度分布)
- 输出给ISP驱动,供AE算法使用
嗯,这里要注意:统计网格的粒度直接影响AE的精度。网格太粗,小目标区域会被背景淹没;网格太细,计算量上去了,噪声也容易被放大。
统计信息采集的另一个关键点是权重图。什么意思?画面不同区域的重要性不一样。比如拍人像,人脸区域应该占更大权重;拍风景,天空和地面权重可以不同。
权重图通常长这样:
// 伪代码:中心权重配置
weight_map[16][16] = {
// 中心区域权重高,边缘权重低
// 数值范围 0~15
{1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1},
// ... 省略中间行
{1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1},
};
权重图配置好之后,AE统计模块会计算加权平均亮度:
加权平均亮度 = Σ(每个网格亮度 × 该网格权重) / Σ(所有网格权重)
这个值,就是AE算法后续判断「画面亮不亮」的依据。
3.2 亮度目标设定:AE的「标尺」
有了当前亮度,还得知道「目标亮度」是多少。这个目标亮度,就是AE要追的标尺。
目标亮度通常用一个目标Y值来表示,范围0~255。比如目标Y=120,意味着AE要让画面平均亮度稳定在120附近。
但问题来了:不同场景的目标亮度一样吗?
当然不一样。你想想看:
- 白天室外,目标Y可以设高一点(比如140~160),画面明亮通透
- 夜晚室内,目标Y要降下来(比如80~100),否则噪点全出来了
- 拍文档,目标Y可以设到180,字迹清晰
- 拍夜景,目标Y设到60~80,保留暗部细节
所以,目标亮度不是固定值,而是动态调整的。RK平台的AE框架里,目标亮度通常由场景检测模块来动态设定。
场景检测会看几个指标:
| 指标 | 说明 | 对目标亮度的影响 |
|---|---|---|
| 环境照度 | 通过AE统计值反推 | 照度低 → 目标亮度降低 |
| 直方图分布 | 亮度是否集中在暗部或亮部 | 暗部集中 → 适当提高目标 |
| 人脸检测结果 | 是否有人脸、人脸亮度 | 有人脸 → 以人脸亮度为参考 |
| 运动检测 | 画面是否有快速运动 | 运动剧烈 → 降低目标避免闪烁 |
我个人习惯的做法是:先设一个基础目标亮度,再根据场景做偏移。比如基础目标Y=120,检测到人脸偏暗,就偏移+10,变成Y=130。
3.3 曝光调整策略:AE的「手脚」
现在知道了当前亮度和目标亮度,接下来就是怎么调。曝光调整策略,就是AE的「手脚」——它决定怎么动曝光参数。
曝光参数主要有三个:
- 曝光时间(Exposure Time):控制传感器感光时长
- 模拟增益(Analog Gain):传感器内部放大信号
- 数字增益(Digital Gain):ISP后端放大信号
这三个参数怎么配合?我画了一张流程图,你看一眼就明白了:
调整策略的核心原则是:先调曝光时间,再调模拟增益,最后调数字增益。为什么是这个顺序?
- 曝光时间:增加曝光时间不会引入额外噪声,但会降低帧率。在帧率允许范围内,优先用曝光时间。
- 模拟增益:会放大传感器噪声,但比数字增益好。曝光时间到上限了,再用模拟增益。
- 数字增益:会放大所有噪声,包括量化噪声。能不用就不用。
具体的调整算法,最常用的是PID控制(比例-积分-微分控制)。
// PID控制AE调整
error = target_luminance - current_luminance;
// 比例项
P = Kp * error;
// 积分项(累加误差)
I += Ki * error * dt;
// 微分项(误差变化率)
D = Kd * (error - last_error) / dt;
// 输出调整量
adjustment = P + I + D;
// 限制调整量范围
adjustment = clamp(adjustment, -MAX_STEP, MAX_STEP);
// 更新曝光参数
exposure_time += adjustment;
PID参数怎么调?我分享一个经验:
| 参数 | 作用 | 调大后的效果 | 我的建议值 |
|---|---|---|---|
| Kp(比例) | 快速响应误差 | 收敛快,但容易过冲 | 0.3~0.5 |
| Ki(积分) | 消除稳态误差 | 消除静差,但可能振荡 | 0.05~0.1 |
| Kd(微分) | 抑制振荡 | 减少过冲,但放大噪声 | 0.01~0.05 |
3.4 三个环节的协同工作
统计信息采集、亮度目标设定、曝光调整策略,这三个环节不是孤立的。它们在一个闭环里协同工作:
- 采集:统计模块算出当前加权平均亮度
- 对比:当前亮度 vs 目标亮度,算出误差
- 调整:根据误差,PID算出调整量,更新曝光参数
- 等待:等待下一帧生效
- 循环:回到第1步
这个循环每帧都在跑。帧率30fps的话,每秒跑30次。所以AE的收敛速度,取决于PID参数和帧率。