2. 自动曝光(AE)基础:曝光三角与工程落地
自动曝光,说白了就是让摄像头在任何光线下都能拍出「看得清」的画面。我做了这么多年 ISP,见过太多 AE 翻车的案例——要么画面忽亮忽暗像呼吸灯,要么暗部噪点炸裂。今天咱们就把 AE 的底牌翻出来看看。
2.1 曝光三角:光圈 / 快门 / 增益
曝光量由三个参数共同决定,这就是经典的曝光三角。在手机摄像头这种固定光圈模组里,其实只剩快门和增益两个自由度。但理解三角关系,是做 AE 算法的基础。
| 参数 | 物理含义 | 对图像的影响 | 工程限制 |
|---|---|---|---|
| 光圈 (Aperture) | 进光孔大小,F 值越小进光越多 | 景深、进光量 | 手机多为固定 F1.6~F2.4 |
| 快门 (Shutter) | 传感器曝光时间,单位 ms | 亮度、运动模糊 | 最大受帧率限制,最小受闪烁抑制 |
| 增益 (Gain) | 模拟/数字放大倍数 | 亮度、噪声 | 过高会炸噪点 |
核心公式: 曝光量 ∝ (1/F²) × 曝光时间 × 增益
增益每翻一倍,信噪比下降约 6dB。这就是为什么我总跟算法团队说:优先调快门,最后动增益。
2.2 AE 目标:亮度与信噪比的博弈
AE 不是单纯把画面变亮。它的目标有两个,而且经常打架:
- 亮度目标: 通常用 Y 通道均值或直方图百分比来衡量。比如目标亮度设为 120(8bit 范围),或者让直方图主峰落在 100~150 区间。
- 信噪比目标: 增益越低,噪声越少。但低增益意味着需要更长的曝光时间,容易拍糊。
我在项目中遇到过一个问题:某款手机在室内灯光下,AE 把增益拉到 8x 来保证 30fps 的亮度。结果画面噪点像雪花一样。后来我们加了 SNR 约束——增益超过 4x 时,强制降低帧率来换取更长的曝光时间。
我的经验: 亮度目标不是死的。暗光场景下,我习惯把目标亮度从 120 降到 80。虽然画面暗一点,但噪点少很多,人眼反而觉得更「干净」。
2.3 AE 收敛速度与稳定性
AE 算法本质上是一个闭环控制系统。传感器输出图像,ISP 统计亮度,算法调整曝光参数,然后下一帧继续。这里有两个关键指标:
- 收敛速度: 从场景切换到达标需要多少帧。太快会 overshoot,太慢用户觉得卡顿。
- 稳定性: 稳定后画面是否闪烁。我见过最离谱的案例——AE 在 2 帧内来回跳,画面像在「呼吸」。
为什么会这样?因为增益和快门对亮度的响应是非线性的。增益调 1 档,亮度变化可能很大;快门调 1 档,变化可能很小。如果 PID 参数没调好,系统就会震荡。
避坑指南: 我曾经在某个项目里直接用固定步长调曝光,结果在室内灯光下 AE 来回震荡。后来改成自适应步长——误差大时大步调,误差小时微调。收敛速度提升了 40%,稳定性也好了。
2.4 AE 工程落地的核心流程
下面这张图是我在多个项目中沉淀下来的 AE 处理流程。它把曝光三角、目标约束和收敛控制串在了一起。
2.5 自适应步长调参策略
收敛速度和稳定性是一对矛盾。我常用的策略是分段自适应:
- 大误差区(亮度误差 > 30%): 大步调,每次调整 2~3 档曝光。目标是快速接近目标。
- 中误差区(10% ~ 30%): 中步调,每次 1 档。避免 overshoot。
- 小误差区(< 10%): 微步调,每次 0.3~0.5 档。保证稳定性。
代码片段:自适应步长计算
// 输入:当前亮度 cur_luma,目标亮度 target_luma
// 输出:曝光调整步长 step
float calc_step(float cur_luma, float target_luma) {
float error = fabs(cur_luma - target_luma) / target_luma;
if (error > 0.3f) {
return 2.5f; // 大步
} else if (error > 0.1f) {
return 1.0f; // 中步
} else {
return 0.4f; // 微步
}
}
2.6 实际项目中的避坑清单
最后,我把自己踩过的坑整理成清单。你想想看,这些场景是不是也遇到过?
| 问题现象 | 根因分析 | 解决方案 |
|---|---|---|
| 画面忽亮忽暗 | PID 参数过大,系统震荡 | 降低积分系数,增加死区 |
| 暗光下噪点多 | 增益过高,SNR 劣化 | 加入 SNR 约束,优先降帧率 |
| 场景切换反应慢 | 步长太小,收敛慢 | 采用自适应步长策略 |
| 室内灯光下闪烁 | 快门时间与电网频率不匹配 | 锁定快门为 1/100s 或 1/120s |
我的习惯: 每次调完 AE 参数,我都会在暗室和强光下各跑一遍测试序列。暗室看噪点,强光看是否过曝。这两个极端场景能暴露 90% 的问题。