自动曝光(AE)基础:曝光三角、直方图与经典控制策略

曝光这事儿,说白了就是控制进光量。我在刚接触ISP pipeline时,总觉得AE不就是调调亮度嘛,有啥难的?后来被各种过曝、欠曝、闪烁问题折磨过之后,才明白这里面门道有多深。

今天咱们就把AE的底牌翻出来看看。你想想看,相机要拍出一张亮度合适的图,本质上就是在做一件事:让传感器接收到恰到好处的光。那怎么控制进光量?靠的就是曝光三角——光圈、快门、ISO。

2.1 曝光三角:三个控制旋钮

这三个参数,每个都影响亮度,但副作用完全不同。我习惯把它们比作三个水龙头:光圈是水管粗细,快门是放水时间,ISO是往水里加颜料。

参数 物理含义 对亮度的影响 副作用
光圈(Aperture) 镜头通光孔径大小 F值越小,进光越多 景深变浅(背景虚化)
快门(Shutter) 传感器曝光时间 时间越长,进光越多 运动模糊、频闪
ISO(增益) 模拟/数字信号放大倍数 增益越大,画面越亮 噪声放大
注意:手机摄像头的光圈通常是固定的(F1.8或F2.0左右),所以手机AE主要调快门和ISO。但安防相机或单反,光圈是可变的,策略就复杂多了。

我在做一款车载摄像头时遇到过一个问题:夜间场景下,为了提亮画面,AE把ISO拉到很高,结果画面全是噪点,算法根本没法做目标检测。后来我强制限制了ISO上限,优先拉长快门——但快门又不能太长,否则车一动就糊了。你看,这就是曝光三角的博弈。

2.2 亮度直方图与目标亮度

AE要判断当前画面亮不亮,不能靠人眼看,得有个量化指标。最常用的就是亮度直方图。

直方图的横轴是亮度值(0~255,8bit),纵轴是像素数量。一张正常曝光的图,直方图应该像一座小山,中间高两边低,不贴边。

  • 过曝:直方图右侧贴墙(像素值集中在255附近)
  • 欠曝:直方图左侧贴墙(像素值集中在0附近)
  • 正常:直方图分布均匀,峰值在中间区域

那目标亮度怎么定?我见过三种主流做法:

  1. 全局平均亮度法:计算整张图的平均亮度,目标值设为128(8bit中值)。简单粗暴,但容易被大面积亮区或暗区带偏。
  2. 区域加权法:把画面分成多个区域,中心区域权重大,边缘权重小。这样拍人脸时,人脸亮度优先保证。
  3. 直方图统计法:统计直方图的分布特征,比如让直方图的众数落在某个区间,或者让累积分布达到某个百分比。

我的经验:在安防场景中,我习惯用区域加权法。把画面分成3x3网格,中心区域权重设为0.5,中间一圈0.3,边缘0.2。这样既能保证主体亮度,又不会完全忽略背景。

2.3 AE的经典控制策略

知道了当前亮度和目标亮度,接下来就是怎么调的问题。AE控制策略,说白了就是一套反馈控制逻辑。

2.3.1 基于亮度的AE(全局AE)

这是最基础的策略。流程很简单:

1. 计算当前帧的平均亮度 L_cur
2. 计算亮度误差 error = L_target - L_cur
3. 根据误差调整曝光参数
   - 如果 error > 0(画面偏暗):增加曝光
   - 如果 error < 0(画面偏亮):减少曝光
4. 调整步长由误差大小决定,通常用PID控制

嗯,这里要注意:直接用平均亮度有个坑。我做过一个测试,拍一张白墙和一张黑板,平均亮度可能都是128,但直方图分布完全不同。白墙的直方图很窄,黑板的也很窄,但一个在右边一个在左边。所以单纯靠平均亮度,你根本不知道画面细节是否保留。

2.3.2 基于区域的AE(ROI-AE)

为了解决全局AE的问题,业界普遍采用基于区域的策略。核心思想是:画面里不同区域的重要性不同。

举个例子,人脸检测框内的区域,亮度优先级最高。我做过一个项目,要求人脸亮度稳定在180±10,背景不管。那AE就只统计人脸框内的像素,框外直接忽略。

实现上分三步:

  1. ROI检测:通过人脸检测、目标检测或固定网格,确定感兴趣区域
  2. 区域权重分配:给每个ROI分配权重,比如人脸权重0.7,天空权重0.1
  3. 加权亮度计算:L_weighted = Σ(wi × Li) / Σ(wi)
小技巧:如果场景里同时有人脸和车牌,我建议给两者都设高权重。人脸要亮,车牌要清晰,两者不能偏废。我曾经在停车场场景里只优化人脸,结果车牌全黑,客户直接打回。

2.3.3 曝光参数调整顺序

调整曝光参数时,顺序很重要。我一般遵循这个优先级:

优先级 调整参数 原因
1(优先) 快门 不影响画质,只影响运动模糊
2 光圈(如果可调) 影响景深,但画质损失小
3(最后) ISO 放大噪声,能不用就不用

说白了就是:先调不影响画质的,再调有副作用的。如果快门已经快到极限(比如1/10000s)画面还是过曝,那就只能缩光圈或降ISO。反过来,如果快门已经慢到手持极限(1/30s)画面还暗,那就只能提ISO了。

2.4 AE控制流程图

下面这张图,是我自己总结的AE控制流程。你看一遍就能明白整个闭环是怎么跑的。

自动曝光(AE)控制流程图 自动曝光(AE)控制流程图 传感器原始图像 亮度直方图统计 计算当前亮度 L_cur 误差计算:error = L_target - L_cur |error| > 阈值? 是 调整快门/光圈/ISO 否 保持当前参数 闭环 反馈至下一帧

这个流程里有个关键点:阈值。如果误差小于阈值,就不调整参数,避免画面频繁闪烁。我一般把阈值设为5~8(8bit范围),这样画面亮度在小范围内波动时,人眼是感觉不到的。

2.5 避坑指南

最后分享几个我踩过的坑:

  • 不要用固定步长:误差大时步长大,误差小时步长小。固定步长要么收敛慢,要么来回震荡。
  • 注意曝光收敛速度:从暗场景切到亮场景,如果收敛太快,画面会闪一下;太慢,用户会等得不耐烦。我一般控制在3~5帧内完成收敛。
  • 小心低帧率下的AE:如果帧率只有15fps,AE调整周期太长,画面亮度变化会一卡一卡的。这时候需要做帧间平滑。
我曾经踩过的坑:在做行车记录仪时,AE没做防闪烁处理。车子经过隧道时,画面亮度剧烈变化,导致录像文件出现大量亮度跳变帧。后来加了帧间平滑和曝光锁定机制,才解决这个问题。