自动曝光(AE)基础:曝光三要素与收敛目标

自动曝光,说白了就是让摄像头自己决定「吃多少光」。我刚开始做ISP的时候,总觉得AE不就是调调亮度嘛,后来被各种过曝、闪烁、拖影折磨过,才明白这里面的门道有多深。今天咱们就把AE的底裤扒干净。

曝光三要素:光圈、快门、增益

这三兄弟共同决定了传感器最终能捕获多少光。你可以把它们想象成一个水龙头接水的过程:

  • 光圈(Aperture) —— 水管的口径。口径越大,单位时间进水量越大。在镜头模组里,光圈通常用F数表示,F值越小,光圈越大。
  • 快门(Shutter) —— 你打开水龙头的时间。时间越长,接的水越多。在传感器里,这就是曝光时间,单位通常是毫秒或微秒。
  • 增益(Gain) —— 你往水里加浓缩剂。水不够多?加点浓缩剂让水看起来更浓。但代价是杂质(噪声)也被放大了。

核心公式: 图像亮度 ∝ 光圈面积 × 曝光时间 × 增益

注意是「∝」不是「=」,因为还有量子效率、透光率等一堆系数。但在工程上,这个比例关系已经足够指导我们做控制了。

我在项目中遇到过一件事:某款手机在暗光下拍出来的照片噪点特别多。一看AE策略,增益拉到6倍,快门却只有1/30秒。我建议把快门降到1/15秒,增益降到3倍,信噪比立刻提升了将近6dB。嗯,这里要注意——很多人不敢降快门,怕手抖糊片,但如果你有OIS或者电子防抖,其实可以大胆一些。

曝光值与亮度关系

曝光值(EV,Exposure Value)是一个标准化的度量,用来描述场景的亮度水平。它的定义是:

EV = log₂(F² / T)

其中F是光圈F数,T是快门时间(秒)。EV每增加1,场景亮度翻倍。你想想看,这个公式把光圈和快门统一到了一个维度上,方便我们做换算。

实际工程中,我们更关心的是数字域里的亮度映射。传感器输出的原始数据经过黑电平校正、线性化之后,会得到一个线性的亮度值。AE算法的目标,就是让这个亮度值落在我们期望的区间内。

场景类型 典型EV范围 目标亮度(8bit归一化) 常见问题
阳光明媚的户外 12 ~ 15 EV 180 ~ 220 高光溢出
阴天/室内 8 ~ 11 EV 120 ~ 160 对比度不足
黄昏/暗光 4 ~ 7 EV 80 ~ 120 噪声明显
夜景/极暗 0 ~ 3 EV 40 ~ 80 信噪比差

这张表是我自己总结的,不同sensor的响应曲线不一样,但大方向不会变。我曾经在调试一款车载摄像头时,发现目标亮度设得太高(200以上),导致夜间高亮车灯区域一片死白。后来把目标亮度降到140,配合局部色调映射,效果好了很多。

AE的收敛目标:目标亮度

AE不是漫无目的地调参数,它有一个明确的靶子——目标亮度(Target Luminance)。这个值通常用一个16x16或32x32的网格统计图的平均亮度来表示。

为什么不用全图平均?你想想看,如果画面里有一大片天空,全图平均会被拉高,导致人脸欠曝。所以实际工程中,我们会做权重分区:

  • 中心区域权重高(人脸通常在这里)
  • 边缘区域权重低
  • 过亮/过暗区域可以降权或剔除

个人习惯: 我会把目标亮度设为一个范围,而不是一个固定值。比如 [110, 140] 的区间,只要统计亮度落在这个区间内,AE就认为收敛了。这样可以避免在临界点来回震荡。

收敛过程本质上是一个闭环反馈控制:

  1. 采集当前帧的亮度统计
  2. 与目标亮度比较,计算误差
  3. 根据误差调整光圈/快门/增益
  4. 等待下一帧,重复步骤1

这里有个坑——我曾经踩过:反馈周期太短。如果你每帧都调整,画面会像呼吸一样忽明忽暗。建议至少等2~3帧再做下一次调整,给系统一个稳定时间。

注意: 增益不是万能的。增益每增加一倍(6dB),噪声的幅度也增加一倍。在暗光场景下,优先拉长快门时间,其次再考虑增益。快门的上限取决于帧率和场景运动程度——拍静态场景可以到1/15秒,拍运动物体最好别低于1/60秒。

知识结构总览

下面这张图把AE的核心逻辑串起来了,建议你保存下来对照着看:

自动曝光(AE)核心知识结构 自动曝光(AE)核心知识结构 光圈(Aperture) 快门(Shutter) 增益(Gain) 曝光值(EV) 数字域亮度映射(归一化值) 目标亮度(Target Luminance) 闭环反馈:采集 → 比较 → 调整 → 等待 → 采集 权重分区 中心高权 边缘低权 剔除过亮/暗 人脸优先 ⚠ 避坑:反馈周期太短会导致画面闪烁,建议每2~3帧调整一次

这张图里,从上到下是「物理参数 → 标准度量 → 数字映射 → 控制目标」的链路。右侧的权重分区框是我特别加上的——很多AE翻车都是因为没做好权重分配。

最后说一句:AE没有银弹。不同场景、不同sensor、不同镜头,参数都要微调。我习惯在调试阶段把AE的中间变量全部dump出来,包括每帧的统计亮度、目标亮度、三要素当前值,画成曲线看收敛过程。这样一眼就能看出是震荡了、收敛慢了、还是目标亮度设得不合理。