自动曝光(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的收敛过程,说白了就是一个闭环反馈系统:
- 传感器采集当前帧的亮度统计值
- AE算法计算目标亮度与当前亮度的差值
- 算法决定调整量(光圈/快门/ISO的变化步长)
- 执行调整,下一帧重复
这里面有两个关键参数:步长(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的目标亮度怎么定——那个坑更多。