3、AE算法核心逻辑:统计信息采集、亮度目标设定、曝光调整策略

AE(自动曝光)说白了,就是让摄像头自己找到那个「不亮不暗刚刚好」的曝光点。很多刚入行的朋友觉得AE就是调个目标亮度值,其实没那么简单。我做了这么多年ISP,踩过的坑大多都跟AE的三个核心环节有关:统计信息怎么采、目标亮度怎么定、曝光怎么调。今天咱们就把这三个环节掰开揉碎了讲。

3.1 统计信息采集:AE的「眼睛」

AE算法第一步,得知道当前画面到底有多亮。这个信息从哪来?从硬件统计模块来。RK平台内部有一个专门的统计引擎,叫AE统计模块(AE Statistic)。

它会做这么几件事:

  • 把整帧图像分成M×N个网格(比如15×15或32×32)
  • 对每个网格计算亮度统计值(通常是Y分量均值)
  • 同时统计直方图信息(亮度分布)
  • 输出给ISP驱动,供AE算法使用

嗯,这里要注意:统计网格的粒度直接影响AE的精度。网格太粗,小目标区域会被背景淹没;网格太细,计算量上去了,噪声也容易被放大。

我的经验:在RK3588平台上,我习惯把网格设为16×16。这个粒度对大部分场景都够用,既不会漏掉人脸区域,也不会让CPU负载过高。如果你做的是人脸优先AE,建议在ROI区域再加密一层网格。

统计信息采集的另一个关键点是权重图。什么意思?画面不同区域的重要性不一样。比如拍人像,人脸区域应该占更大权重;拍风景,天空和地面权重可以不同。

权重图通常长这样:

// 伪代码:中心权重配置
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算法后续判断「画面亮不亮」的依据。

避坑指南:我曾经在一个项目中,统计模块的权重图配错了——中心区域权重设成了0。结果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后端放大信号

这三个参数怎么配合?我画了一张流程图,你看一眼就明白了:

AE曝光调整策略流程图 计算亮度误差 误差 > 阈值? 是 执行曝光调整 否 保持当前参数 优先调曝光时间 曝光时间饱和→调模拟增益 模拟增益饱和→调数字增益 调整优先级:曝光时间 → 模拟增益 → 数字增益 数字增益会放大噪声,尽量少用。曝光时间受帧率限制,不能无限长。

调整策略的核心原则是:先调曝光时间,再调模拟增益,最后调数字增益。为什么是这个顺序?

  • 曝光时间:增加曝光时间不会引入额外噪声,但会降低帧率。在帧率允许范围内,优先用曝光时间。
  • 模拟增益:会放大传感器噪声,但比数字增益好。曝光时间到上限了,再用模拟增益。
  • 数字增益:会放大所有噪声,包括量化噪声。能不用就不用。

具体的调整算法,最常用的是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
避坑指南:我曾经在一个项目中,Kp设得太大(1.2),结果AE在明暗交替场景下疯狂振荡,画面像呼吸灯一样忽明忽暗。后来把Kp降到0.4,Ki设了0.08,才稳定下来。记住:AE追求的是稳定,不是速度。

3.4 三个环节的协同工作

统计信息采集、亮度目标设定、曝光调整策略,这三个环节不是孤立的。它们在一个闭环里协同工作:

  1. 采集:统计模块算出当前加权平均亮度
  2. 对比:当前亮度 vs 目标亮度,算出误差
  3. 调整:根据误差,PID算出调整量,更新曝光参数
  4. 等待:等待下一帧生效
  5. 循环:回到第1步

这个循环每帧都在跑。帧率30fps的话,每秒跑30次。所以AE的收敛速度,取决于PID参数和帧率。

核心要点:AE调优的本质,就是让这个闭环在「响应速度」和「稳定性」之间找到平衡。响应太快会振荡,响应太慢会拖影。这个平衡点,就是调优工程师的价值所在。