自动曝光(AE)核心原理:曝光三角与AE控制策略

各位同学,今天我们来聊聊自动曝光(AE)。这是ISP 3A算法里最基础、也最容易被忽视的一环。我见过不少工程师,调了半年3A,最后还是被曝光问题卡住——画面忽亮忽暗,或者暗部噪点炸裂。说白了,AE没调好,后面所有算法都是白搭。

我们先从最底层的物理概念讲起。曝光三角——光圈、快门、ISO,这三个东西决定了传感器能接收到多少光,以及怎么处理这些光。你想想看,它们就像水龙头、水桶和滤网的关系。

曝光三角的物理意义

参数 物理含义 对图像的影响 我踩过的坑
光圈(Aperture) 镜头通光孔径大小,用F数表示(F1.4、F2.0等) F值越小,进光量越大;同时影响景深 手机端光圈固定,调不了,很多人忘了这茬
快门(Shutter) 传感器曝光时间,单位秒或毫秒 时间越长,进光越多;但运动物体会模糊 室内拍小孩,快门低于1/60s必糊
ISO(增益) 模拟/数字信号放大倍数 ISO越高,亮度越高,但噪声也越明显 ISO 3200以上,暗部全是彩色噪点

核心公式:曝光量 = 光圈面积 × 快门时间 × (1 / ISO增益系数)

注意:ISO本质是放大,不是"进光"。ISO 800比ISO 100亮8倍,但信噪比也差了约9dB。

我在项目中遇到过一件事。某款安防摄像头,夜间模式总是噪点爆炸。团队一开始拼命降ISO,结果画面暗到没法看。后来我查了日志,发现快门被锁死在1/30s——因为工程师怕运动模糊。最后我们把快门放宽到1/8s,配合电子防抖,ISO从6400降到了800,画面干净多了。嗯,这就是曝光三角的平衡艺术。

AE控制策略:三种模式

实际产品里,我们不会让用户手动调这三个参数。AE算法要自动决定:先动哪个,后动哪个,哪个不动。这就是控制策略。

1. 光圈优先(Aperture Priority)

你先定好光圈,AE算法自动调快门和ISO。适合需要控制景深的场景——拍人像要虚化背景,就开大光圈;拍风景要全清晰,就收小光圈。

  • 优点:景深可控,适合创意拍摄
  • 缺点:光线不足时,快门可能太慢导致模糊
  • 我建议:手机端很少用,因为光圈固定;但单反/微单上很常见

2. 快门优先(Shutter Priority)

你先定好快门速度,AE算法自动调光圈和ISO。适合运动场景——拍赛车、打球、小孩跑动,快门必须够快。

  • 优点:冻结运动,画面清晰
  • 缺点:暗光下光圈开到最大还不够,ISO就飙上去了
  • 避坑指南:我曾经在运动相机项目里,把快门优先的默认值设成1/120s,结果室内录像全是噪点。后来改成1/60s+电子防抖,效果好了很多

3. 程序自动(Program Auto)

AE算法自己决定光圈、快门、ISO的搭配。这是最常用的模式,也是ISP默认模式。算法会按一个预设的"曝光表"来走。

  • 优点:省心,适合大多数场景
  • 缺点:算法不一定理解你的意图
  • 实际经验:程序自动模式下,我一般会加一个"场景检测"前置模块——检测到人脸就偏重人脸亮度,检测到夜景就优先降噪

我的调优习惯:在手机ISP项目里,我通常把程序自动作为基础,然后根据场景切换策略。比如检测到高动态场景,就自动切到"光圈优先+低ISO";检测到运动场景,就切到"快门优先"。这样用户感知不到切换,但画质明显提升。

AE的收敛速度与稳定性

这是AE算法里最头疼的部分。收敛速度太快,画面会闪烁、震荡;太慢,用户都拍完了还没稳定。你想想看,用户从室内走到室外,画面要花3秒才变亮——这产品谁敢用?

AE的收敛过程,说白了就是一个闭环反馈系统:

  1. 传感器采集当前帧的亮度统计值
  2. AE算法计算目标亮度与当前亮度的差值
  3. 算法决定调整量(光圈/快门/ISO的变化步长)
  4. 执行调整,下一帧重复

这里面有两个关键参数:步长(Step Size)和死区(Dead Zone)。

参数 定义 调太大 调太小
步长 每次调整的曝光量变化幅度 收敛快,但容易过冲、震荡 收敛慢,但稳定
死区 亮度误差在多少以内算"已收敛" 容易误判为收敛,实际还有偏差 收敛精度高,但可能永远调不到

注意:收敛速度和稳定性是矛盾的。你不可能同时做到"快"和"稳"。我一般做法是:先大步快速逼近目标,再小步精细调整。这叫"粗调+细调"策略。具体实现时,误差大于10%用大步,小于5%用小步,中间用中步。

我曾经在一个行车记录仪项目里,AE收敛速度调得太激进。结果车子过隧道时,画面从亮到暗来回震荡了3次才稳定——用户投诉说"眼睛都快闪瞎了"。后来我把步长减半,增加了2帧的滤波窗口,震荡问题就解决了。代价是收敛时间从0.5秒变成了1.2秒,但用户感知不到这个差异。

AE收敛的工程实现要点

实际代码里,AE算法通常长这样:

// 伪代码:AE收敛核心逻辑
float current_luminance = get_frame_luminance();
float target_luminance = get_target_luminance(); // 由场景检测决定
float error = target_luminance - current_luminance;

// 死区判断
if (abs(error) < DEAD_ZONE) {
    // 已收敛,不做调整
    return;
}

// 计算步长(粗调/细调策略)
float step = (abs(error) > 0.1 * target_luminance) ? 
             LARGE_STEP : SMALL_STEP;

// 限制单次最大调整量(防震荡)
step = min(step, MAX_STEP_PER_FRAME);

// 更新曝光参数
exposure_time += step * sign(error);
// 如果曝光时间超出范围,调整ISO
if (exposure_time > MAX_EXPOSURE_TIME) {
    exposure_time = MAX_EXPOSURE_TIME;
    iso_gain += step * sign(error);
}

这段代码看起来简单,但实际产品里要考虑的东西多得多:

  • 帧率同步:AE调整不能比帧率快,否则画面会跳变
  • 多区域权重:人脸区域权重高,天空区域权重低
  • 历史滤波:对亮度统计值做时域滤波,防止单帧噪声干扰
  • 场景切换检测:突然从室内到室外,要重置收敛状态

我的经验法则:AE收敛时间控制在0.5~1.5秒之间。太快(<0.3秒)容易震荡,太慢(>2秒)用户会不耐烦。具体数值取决于产品定位——安防摄像头可以慢一点(2~3秒),手机拍照必须快(<1秒)。

好了,曝光三角和AE控制策略的核心内容就这些。记住一句话:AE不是简单的"调亮度",而是在光圈、快门、ISO三个维度上做平衡,同时兼顾收敛速度和稳定性。下一节我们会讲AE的目标亮度怎么定——那个坑更多。

AE核心知识体系 自动曝光(AE) 曝光三角 光圈 快门 ISO 控制策略 光圈优先 快门优先 程序自动 收敛特性 收敛速度 稳定性 步长 vs 死区 核心平衡关系 • 曝光三角:光圈×快门×ISO → 总曝光量 • 控制策略:根据场景选择优先调节的参数 • 收敛特性:步长大→速度快但易震荡;死区大→稳定但精度低 • 工程目标:0.5~1.5秒收敛,无震荡,适应场景切换