手机Camera 3A算法与ISP协同调优实战 - 第2节
自动曝光(AE)算法原理:AE的目标与评价指标
自动曝光,说白了就是让摄像头帮你决定「画面该亮到什么程度」。我刚开始做ISP时,总觉得AE不就是调个亮度嘛,后来才发现——这里面的坑,一个比一个深。
AE的核心目标其实就三个:亮度合适、细节保留、稳定不闪。你想想看,如果拍一张亮处的照片,暗部全黑了,那叫失败;反过来,暗处拍亮了,高光过曝一片白,也不行。
AE的评价指标
我个人习惯把AE的评价指标分成两类:客观指标和主观指标。
| 指标类型 | 具体指标 | 说明 |
|---|---|---|
| 客观指标 | 平均亮度(Y均值) | 整帧或ROI区域的亮度统计值 |
| 直方图分布 | 像素亮度分布是否集中在中间区域 | |
| 过曝/欠曝像素占比 | 亮度>240或<16的像素比例 | |
| 帧间亮度变化率 | 相邻帧亮度跳变幅度 | |
| 主观指标 | 视觉舒适度 | 人眼看起来是否自然 |
| 场景适应性 | 逆光、夜景等特殊场景表现 |
关键点:客观指标是底线,主观指标是天花板。我见过很多方案客观指标跑分很高,但拍出来的照片就是「怪怪的」——那就是主观指标没调好。
测光模式:全局、中央重点、点测光
测光模式,说白了就是「摄像头该听谁的」。是整个画面一起决定亮度,还是只盯着某个区域?
全局测光(平均测光)
把整个画面的亮度取平均。适合光线均匀的场景,比如阴天、室内均匀光照。
我在项目中遇到过一个问题:用全局测光拍逆光人像,人脸黑成一片,背景却正常。为什么?因为背景天空太亮,把平均亮度拉上去了,人脸自然就欠曝了。
中央重点测光
画面中央区域权重更高,边缘区域权重低。适合主体在中央的场景,比如证件照、产品拍摄。
权重分配一般是:中央60%,边缘40%。具体比例各家芯片厂商有差异,但思路是一样的——让中央说了算,但边缘也有发言权。
点测光
只取画面中一个很小的区域(通常1%-5%)来计算亮度。适合逆光、舞台、夜景等极端场景。
我的经验:点测光是最难调好的模式。我曾经在一个项目中,点测光区域选在了人脸,结果人脸亮度正常了,背景全白了——因为背景太亮,AE为了压人脸亮度,把曝光时间拉得太长。后来我加了一个「亮度上限钳位」,才解决这个问题。
| 测光模式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 全局测光 | 均匀光照 | 简单稳定 | 逆光场景失效 |
| 中央重点 | 主体居中 | 兼顾中央与边缘 | 主体偏移时效果差 |
| 点测光 | 极端场景 | 精准控制 | 容易导致背景过曝/欠曝 |
曝光表与曝光策略
曝光表,就是AE的「食谱」。它告诉摄像头:在某个亮度下,该用多大的光圈、多快的快门、多高的增益。
曝光表的结构
一个典型的曝光表长这样:
// 曝光表示例(简化版)
struct ExposureEntry {
uint16_t targetLuminance; // 目标亮度(0-255)
uint16_t exposureTime; // 曝光时间(us)
uint16_t analogGain; // 模拟增益(倍数*100)
uint16_t digitalGain; // 数字增益(倍数*100)
};
// 曝光表数组
ExposureEntry exposureTable[] = {
{ 80, 10000, 100, 100 }, // 暗场景:长曝光+低增益
{ 120, 5000, 150, 100 }, // 中等亮度
{ 160, 2000, 200, 100 }, // 较亮场景
{ 200, 1000, 300, 150 }, // 亮场景:短曝光+高增益
};
你可能会问:为什么亮场景反而用高增益?这不是增加噪声吗?嗯,这里要注意——亮场景下曝光时间短,信号量本来就少,需要增益来补足。但增益会放大噪声,所以这是个权衡。
曝光策略
曝光策略决定了AE如何从当前状态切换到目标状态。我常用的策略有三种:
- 快速收敛策略:大步调整,适合场景切换时。缺点是容易过冲。
- 平滑收敛策略:小步微调,适合稳定场景。缺点是收敛慢。
- 混合策略:先快后慢,先大步接近目标,再小步微调。我个人最推荐这种。
避坑指南:我曾经在一个项目中,用了快速收敛策略,结果在室内灯光下,AE在50ms内从暗到亮来回跳了3次——画面一直在闪烁。后来我加了「帧间亮度变化限制」,每帧最多调整10%的亮度,才稳定下来。
AE的核心流程
下面这张图展示了AE的完整工作流程:
曝光参数调整顺序
调整曝光参数时,顺序很重要。我一般遵循这个优先级:
- 先调曝光时间:影响最大,但受限于帧率(不能超过1/帧率)
- 再调模拟增益:噪声控制较好,但增益范围有限
- 最后调数字增益:会放大数字噪声,尽量少用
我的习惯:在移动端项目中,我通常把数字增益的上限限制在2倍以内。超过这个值,噪声就肉眼可见了。如果还不够亮,那就得考虑补光或者降低目标亮度。
AE调优的常见问题
- 闪烁问题:帧间亮度跳变太大。解决方案:加帧间平滑滤波,限制每帧调整幅度。
- 过曝/欠曝:目标亮度设置不合理。解决方案:根据场景动态调整目标亮度。
- 收敛慢:调整步长太小。解决方案:使用混合策略,先快后慢。
- 场景误判:测光模式选错。解决方案:增加场景检测,自动切换测光模式。
我曾经踩过的坑:在一个安防项目中,AE在夜间模式下频繁闪烁。排查了三天,最后发现是曝光时间调整时没有考虑帧率限制——曝光时间从10ms跳到30ms,帧率直接从30fps掉到10fps,画面卡顿。后来我加了一个「曝光时间-帧率联动表」,才彻底解决。