自动曝光(Auto Exposure,AE)的任务并不是把每一帧都变成相同亮度,而是在传感器、镜头、帧率和场景运动的约束下,持续选择“下一帧应该采集多少光”。因此 AE 更像一个带约束的闭环控制系统,而不是单次执行的亮度增强算法。
一条典型 AE 链路可以概括为:
传感器图像 → 亮度统计与 ROI 权重 → 目标亮度与曝光误差→ 时域控制器 → 曝光量分配 → 快门 / 光圈 / 模拟增益→ 下一帧图像 → 再次统计这条环路里的每一步都可能改变最终观感。测光区域选错会让背景支配主体;目标设置不合理会把夜景照成白天;控制器过快会闪烁,过慢又跟不上场景;曝光量分配不当则会在运动模糊、噪声与高光余量之间做出错误交换。
用一组变量看完整闭环
把第 帧图像记为 ,统计模块用当前权重 得到亮度观测 ;场景策略给出目标 。曝光补偿 也写在 EV 域中,则误差为:
控制器不会直接输出某个快门值,而是先更新总曝光命令 。执行器再把 代表的曝光倍率分配给快门 、光圈 和增益 :
命令通常要经过 帧才反映到统计中,可把被控对象粗略写成:
汇总了场景照度、反射率和传感器响应。这个表达把链路分成了观测、目标、控制、执行和反馈五个职责,但没有描述真实 ISP 的非线性、HDR 多曝光、寄存器量化或场景运动;它只用于建立系统边界。
下面的 NumPy 示例完成一次最小闭环:从分区亮度得到观测,在 EV 域限制单帧步长,再把总曝光量优先分给快门,剩余部分交给增益。
import numpy as np
# 4 个测光分区;中心主体权重更高zones = np.array([0.10, 0.18, 0.22, 0.12], dtype=float)weights = np.array([1.0, 2.0, 2.0, 1.0], dtype=float)target = 0.30
measured = np.average(zones, weights=weights)error_ev = np.log2(target / max(measured, 1e-6))step_ev = np.clip(0.6 * error_ev, -0.5, 0.5)exposure_ratio = 2.0 ** step_ev
# 教学用执行器:基准为 1/250 s、ISO 100,快门最长允许 1/60 sbase_shutter = 1.0 / 250.0max_shutter = 1.0 / 60.0shutter = min(base_shutter * exposure_ratio, max_shutter)gain = exposure_ratio / (shutter / base_shutter)iso = 100.0 * gain
print(f"measurement={measured:.3f}, error={error_ev:+.2f} EV")1 collapsed line
print(f"command={step_ev:+.2f} EV, shutter=1/{1/shutter:.0f} s, ISO≈{iso:.0f}")这段代码只执行一个控制步,也把光圈固定不变。量产 AE 会跨帧保存状态,并同时考虑命令延迟、运动风险、模拟增益档位和防频闪安全快门;后两篇分别展开统计目标与时域执行。
从“测亮度”到“决定曝光”
AE 首先从传感器或 ISP 统计模块获得直方图、分区亮度、饱和比例以及可能的人脸 ROI。统计值并不自动等于拍摄意图:同一幅逆光人像,全局平均与人脸重点测光会给出完全不同的结论。
得到测量值 后,系统还需要给出目标 。常用的曝光误差写在 EV 域中:
表示曝光量约需增加一档, 表示约需减半。曝光补偿、场景识别、高光保护和人脸优先,本质上都在修改目标或限制可接受误差。
关于统计窗口、测光权重、目标亮度与曝光补偿,下一篇会单独展开:AE 怎样测量亮度?从测光统计到曝光目标。
AE 是一个跨帧闭环
曝光命令只会影响后续帧,统计本身也含噪声。若控制器把一帧估出的全部误差立即补完,延迟与误差很容易造成亮暗来回摆动。最简单的一阶响应可以写为:
其中 决定单帧修正比例。
曝光为什么不能一步跳到目标
反馈速度越快,亮度响应越及时;但测量噪声、延迟和场景变化会让激进控制产生闪烁。
教学曲线是一阶控制器。真实 AE 还要处理统计延迟、曝光生效延迟、上下行速度不对称和场景切换检测。
产品中的 AE 通常还会加入死区、上下行不同速度、最大单帧步长、场景突变检测和曝光命令延迟补偿。录像强调平滑,拍照预览则可能在构图变化后暂时提高响应速度。
曝光量不是一个独立旋钮
控制器输出“增加一档”之后,还要把曝光量分配给硬件:
- 延长快门能收集更多光子,但会增加运动模糊,并受帧率限制;
- 提高模拟增益有助于冻结运动,但会放大噪声并减少高光余量;
- 数字增益通常只是码值缩放,不能提高传感器实际信噪比;
- 可变光圈能改变进光量与景深,但手机等设备常使用固定光圈;
- HDR 传感器还要同时约束长短曝光比例与各自饱和风险。
人工照明进一步限制可用快门。50 Hz 市电环境常对应 100 Hz 光强周期,60 Hz 则常对应 120 Hz;快门若没有与周期协调,滚动快门画面可能出现横向条带或逐帧明暗变化。LED PWM 频率还可能完全不同。
闭环参数、快门与增益分配以及防频闪策略会在专题中继续说明:AE 怎样稳定收敛?从曝光闭环到防频闪。
AE 与 ISP 不能互相替代
AE 发生在采集决策阶段,Tone Mapping、Gamma 与数字提亮发生在已有信号的呈现阶段。后处理可以让暗部看起来更亮,却不能补回没有被传感器采集的光子;高光一旦饱和,后处理也无法恢复原始层次。
实际相机可能让 AE 与 Tone Mapping 联动,但二者职责仍应分清:AE 管理传感器曝光与信噪比,ISP 管理已采集动态范围如何映射到输出。
系统验证要看时间和场景
静态灰卡只能验证局部正确性。完整 AE 还应检查:
- 主体在明暗背景间移动时,曝光是否稳定;
- 场景突变后的收敛帧数、过冲与回摆;
- 人脸 ROI 出现、消失或切换时是否产生跳变;
- 低照度运动场景中的模糊、噪声与高光取舍;
- 50 Hz、60 Hz 以及多种 LED PWM 灯具下的条带;
- 视频帧率、传感器寄存器量化和曝光生效延迟;
- HDR 多曝光模式切换时的亮度连续性。
理解 AE 的关键,是把它看成“测量—目标—控制—执行—再测量”的循环。接下来的两篇专题会分别拆开环路前半段的统计决策,以及后半段的时域控制与硬件约束。