自动曝光(AE)基础:曝光三角与核心机制
自动曝光,说白了就是让摄像头自己决定「多亮才算合适」。我刚开始做ISP时,觉得AE不就是调调亮度嘛,后来被各种场景教做人——逆光、纯黑、闪烁光源……嗯,今天咱们先把AE的底子打牢。
曝光三角:ISO / Shutter / Aperture
这三兄弟共同决定进光量。你想想看,就像用水桶接水:
- Shutter(快门)——接水的时间。时间越长,水越多,但手抖容易洒。
- Aperture(光圈)——水龙头开多大。开得大,水流猛,但景深变浅。
- ISO(增益)——往水里加浓缩剂。信号放大,但噪声也跟着放大。
我在项目中遇到过一款手机摄像头,光圈固定F1.8,那就只能调快门和ISO。暗光下快门一慢,画面就糊。后来我强制限制快门上限1/30s,剩下的靠ISO扛——虽然噪点多,但至少不糊。
| 参数 | 物理含义 | 对图像的影响 | 调试时注意 |
|---|---|---|---|
| Shutter | 传感器曝光时间 | 亮度↑,运动模糊↑ | 避免低于安全快门 |
| Aperture | 镜头通光孔径 | 亮度↑,景深↓ | 手机多为固定光圈 |
| ISO | 模拟/数字增益 | 亮度↑,噪声↑ | 高ISO会丢细节 |
AE目标亮度与统计直方图
AE要回答一个问题:画面多亮才算「正常」?这个目标亮度通常用一个数字表示——比如Y通道均值=120(8bit)。但光看均值不够,你想想看,一张图一半黑一半白,均值也是128,但显然不是好曝光。
所以我们需要统计直方图。它把像素亮度从0到255分成256个bin,数一数每个bin里有多少像素。
核心思路:AE不是让均值等于目标,而是让直方图的「主体」落在目标区间。比如人脸场景,我们希望肤色区域集中在120~180之间。
我曾经调试一个安防摄像头,夜间画面整体偏暗,但均值已经达标了。一看直方图,原来是一盏路灯占了大量高亮像素,拉高了均值。实际场景暗得不行。后来我改用分区加权直方图,中间区域权重高,边缘权重低,才解决问题。
直方图统计的几种策略
- 全局均值:简单粗暴,但容易被极端亮度欺骗。
- 分区统计:把画面分成3x3或5x5网格,每个区域独立统计。
- 人脸加权:检测到人脸时,人脸区域权重×3。
- 亮度分布比例:统计过暗(0~30)和过亮(220~255)像素占比,避免欠曝/过曝。
AE收敛速度与稳定性
AE是一个闭环控制系统。传感器输出当前帧,ISP统计亮度,算法算出新的曝光参数,下一帧生效。这个循环跑得不好,画面就会忽明忽暗——我们叫它闪烁或振荡。
收敛速度要快,但不能太快。为什么?因为太快会导致超调——画面一下亮过头,又一下暗过头,来回震荡。我见过一个方案,收敛只用3帧,结果在日光灯下疯狂闪烁,因为每次调整都过了头。
| 指标 | 含义 | 理想值 | 调试经验 |
|---|---|---|---|
| 收敛帧数 | 从场景变化到稳定 | 5~15帧 | 场景切换快则用5帧,慢则用15帧 |
| 超调量 | 超过目标亮度的幅度 | <10% | 超调超过20%人眼就能察觉 |
| 稳态抖动 | 稳定后的亮度波动 | <3% | 抖动大说明增益或步长太大 |
常用的收敛策略
- PID控制:比例项决定响应速度,积分项消除静差,微分项抑制超调。我习惯P=0.3,I=0.05,D=0.1起步。
- 步长限制:每次调整不超过1档EV(曝光值)。比如从ISO 100跳到200可以,但直接跳到800不行。
- 死区设置:当前亮度与目标亮度偏差小于5%时,不做调整。避免微小的噪声引起反复调节。
- 帧间平滑:对计算出的目标曝光参数做IIR滤波,alpha=0.3~0.5。
AE核心流程(SVG)
下面这张图展示了AE从传感器到ISP再到控制的完整闭环。我习惯把它画在调试白板上,每次调参都对照着看。
实战中的AE调试要点
光讲理论不够,我分享几个实际调试中遇到的坑:
- 场景切换检测:不要每帧都调。我习惯用帧差法检测场景是否变化,变化超过阈值才启动AE收敛。
- 低帧率场景:如果帧率只有15fps,收敛帧数要放宽到10~20帧,否则每帧调整幅度太大。
- HDR模式下的AE:多帧合成的AE要单独处理,因为短帧和长帧的曝光参数是耦合的。
- 闪烁光源环境:50Hz/60Hz的日光灯下,快门时间要避开半周期倍数,否则画面会闪烁。
嗯,AE的基础就这些。曝光三角是物理基础,直方图是统计基础,收敛策略是控制基础。这三样搞明白了,后面再讲复杂场景(逆光、夜景、人脸)就顺了。