1716 字
9 分钟
相机怎样决定明暗?AE 自动曝光系统总览

自动曝光(Auto Exposure,AE)的任务并不是把每一帧都变成相同亮度,而是在传感器、镜头、帧率和场景运动的约束下,持续选择“下一帧应该采集多少光”。因此 AE 更像一个带约束的闭环控制系统,而不是单次执行的亮度增强算法。

一条典型 AE 链路可以概括为:

传感器图像 → 亮度统计与 ROI 权重 → 目标亮度与曝光误差
→ 时域控制器 → 曝光量分配 → 快门 / 光圈 / 模拟增益
→ 下一帧图像 → 再次统计

这条环路里的每一步都可能改变最终观感。测光区域选错会让背景支配主体;目标设置不合理会把夜景照成白天;控制器过快会闪烁,过慢又跟不上场景;曝光量分配不当则会在运动模糊、噪声与高光余量之间做出错误交换。

用一组变量看完整闭环#

把第 nn 帧图像记为 InI_n,统计模块用当前权重 wnw_n 得到亮度观测 Ym,nY_{m,n};场景策略给出目标 Yt,nY_{t,n}。曝光补偿 cnc_n 也写在 EV 域中,则误差为:

Ym,n=Φ(In,wn),en=log2Yt,nmax(Ym,n,ϵ)+cnY_{m,n}=\Phi(I_n,w_n),\qquad e_n=\log_2\frac{Y_{t,n}}{\max(Y_{m,n},\epsilon)}+c_n

控制器不会直接输出某个快门值,而是先更新总曝光命令 unu_n。执行器再把 2un2^{u_n} 代表的曝光倍率分配给快门 tt、光圈 NN 和增益 GG

un+1=clip(un+αen,umin,umax),HntnGnNn2=H02unu_{n+1}=\operatorname{clip}(u_n+\alpha e_n,u_{min},u_{max}), \qquad H_n\propto\frac{t_nG_n}{N_n^2}=H_0\,2^{u_n}

命令通常要经过 dd 帧才反映到统计中,可把被控对象粗略写成:

Ym,n+dclip ⁣(KnHn,0,Ysat)Y_{m,n+d}\approx \operatorname{clip}\!\left(K_nH_n,0,Y_{sat}\right)

KnK_n 汇总了场景照度、反射率和传感器响应。这个表达把链路分成了观测、目标、控制、执行和反馈五个职责,但没有描述真实 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 s
base_shutter = 1.0 / 250.0
max_shutter = 1.0 / 60.0
shutter = 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。统计值并不自动等于拍摄意图:同一幅逆光人像,全局平均与人脸重点测光会给出完全不同的结论。

得到测量值 YmY_m 后,系统还需要给出目标 YtY_t。常用的曝光误差写在 EV 域中:

e=log2Ytmax(Ym,ϵ)e=\log_2\frac{Y_t}{\max(Y_m,\epsilon)}

e=1e=1 表示曝光量约需增加一档,e=1e=-1 表示约需减半。曝光补偿、场景识别、高光保护和人脸优先,本质上都在修改目标或限制可接受误差。

关于统计窗口、测光权重、目标亮度与曝光补偿,下一篇会单独展开:AE 怎样测量亮度?从测光统计到曝光目标

AE 是一个跨帧闭环#

曝光命令只会影响后续帧,统计本身也含噪声。若控制器把一帧估出的全部误差立即补完,延迟与误差很容易造成亮暗来回摆动。最简单的一阶响应可以写为:

En+1=En+α(EtEn)E_{n+1}=E_n+\alpha(E_t-E_n)

其中 α\alpha 决定单帧修正比例。

曝光为什么不能一步跳到目标

反馈速度越快,亮度响应越及时;但测量噪声、延迟和场景变化会让激进控制产生闪烁。

输出亮度 / 帧
第 14 帧亮度0.64
剩余误差0.007

教学曲线是一阶控制器。真实 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 还应检查:

  1. 主体在明暗背景间移动时,曝光是否稳定;
  2. 场景突变后的收敛帧数、过冲与回摆;
  3. 人脸 ROI 出现、消失或切换时是否产生跳变;
  4. 低照度运动场景中的模糊、噪声与高光取舍;
  5. 50 Hz、60 Hz 以及多种 LED PWM 灯具下的条带;
  6. 视频帧率、传感器寄存器量化和曝光生效延迟;
  7. HDR 多曝光模式切换时的亮度连续性。

理解 AE 的关键,是把它看成“测量—目标—控制—执行—再测量”的循环。接下来的两篇专题会分别拆开环路前半段的统计决策,以及后半段的时域控制与硬件约束。

相机怎样决定明暗?AE 自动曝光系统总览
https://cloudsir.top/posts/how-auto-exposure-works/
作者
CloudSir
发布于
2026-08-25
许可协议
CC BY-NC-SA 4.0
AE 怎样测量亮度?从测光统计到曝光目标
AWB 如何保持稳定?置信度、混合光与时域控制