手机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如何从当前状态切换到目标状态。我常用的策略有三种:

  1. 快速收敛策略:大步调整,适合场景切换时。缺点是容易过冲。
  2. 平滑收敛策略:小步微调,适合稳定场景。缺点是收敛慢。
  3. 混合策略:先快后慢,先大步接近目标,再小步微调。我个人最推荐这种。

避坑指南:我曾经在一个项目中,用了快速收敛策略,结果在室内灯光下,AE在50ms内从暗到亮来回跳了3次——画面一直在闪烁。后来我加了「帧间亮度变化限制」,每帧最多调整10%的亮度,才稳定下来。

AE的核心流程

下面这张图展示了AE的完整工作流程:

AE核心工作流程 图像帧输入 亮度统计(测光) 亮度 vs 目标值 是否在容差范围内? 保持当前参数 调整曝光参数 说明:AE是一个闭环反馈系统,每帧都会重复上述流程,直到亮度稳定在目标值附近

曝光参数调整顺序

调整曝光参数时,顺序很重要。我一般遵循这个优先级:

  1. 先调曝光时间:影响最大,但受限于帧率(不能超过1/帧率)
  2. 再调模拟增益:噪声控制较好,但增益范围有限
  3. 最后调数字增益:会放大数字噪声,尽量少用

我的习惯:在移动端项目中,我通常把数字增益的上限限制在2倍以内。超过这个值,噪声就肉眼可见了。如果还不够亮,那就得考虑补光或者降低目标亮度。

AE调优的常见问题

  • 闪烁问题:帧间亮度跳变太大。解决方案:加帧间平滑滤波,限制每帧调整幅度。
  • 过曝/欠曝:目标亮度设置不合理。解决方案:根据场景动态调整目标亮度。
  • 收敛慢:调整步长太小。解决方案:使用混合策略,先快后慢。
  • 场景误判:测光模式选错。解决方案:增加场景检测,自动切换测光模式。

我曾经踩过的坑:在一个安防项目中,AE在夜间模式下频繁闪烁。排查了三天,最后发现是曝光时间调整时没有考虑帧率限制——曝光时间从10ms跳到30ms,帧率直接从30fps掉到10fps,画面卡顿。后来我加了一个「曝光时间-帧率联动表」,才彻底解决。