自动曝光(AE)基础:曝光三角、直方图与经典控制策略
曝光这事儿,说白了就是控制进光量。我在刚接触ISP pipeline时,总觉得AE不就是调调亮度嘛,有啥难的?后来被各种过曝、欠曝、闪烁问题折磨过之后,才明白这里面门道有多深。
今天咱们就把AE的底牌翻出来看看。你想想看,相机要拍出一张亮度合适的图,本质上就是在做一件事:让传感器接收到恰到好处的光。那怎么控制进光量?靠的就是曝光三角——光圈、快门、ISO。
2.1 曝光三角:三个控制旋钮
这三个参数,每个都影响亮度,但副作用完全不同。我习惯把它们比作三个水龙头:光圈是水管粗细,快门是放水时间,ISO是往水里加颜料。
| 参数 | 物理含义 | 对亮度的影响 | 副作用 |
|---|---|---|---|
| 光圈(Aperture) | 镜头通光孔径大小 | F值越小,进光越多 | 景深变浅(背景虚化) |
| 快门(Shutter) | 传感器曝光时间 | 时间越长,进光越多 | 运动模糊、频闪 |
| ISO(增益) | 模拟/数字信号放大倍数 | 增益越大,画面越亮 | 噪声放大 |
我在做一款车载摄像头时遇到过一个问题:夜间场景下,为了提亮画面,AE把ISO拉到很高,结果画面全是噪点,算法根本没法做目标检测。后来我强制限制了ISO上限,优先拉长快门——但快门又不能太长,否则车一动就糊了。你看,这就是曝光三角的博弈。
2.2 亮度直方图与目标亮度
AE要判断当前画面亮不亮,不能靠人眼看,得有个量化指标。最常用的就是亮度直方图。
直方图的横轴是亮度值(0~255,8bit),纵轴是像素数量。一张正常曝光的图,直方图应该像一座小山,中间高两边低,不贴边。
- 过曝:直方图右侧贴墙(像素值集中在255附近)
- 欠曝:直方图左侧贴墙(像素值集中在0附近)
- 正常:直方图分布均匀,峰值在中间区域
那目标亮度怎么定?我见过三种主流做法:
- 全局平均亮度法:计算整张图的平均亮度,目标值设为128(8bit中值)。简单粗暴,但容易被大面积亮区或暗区带偏。
- 区域加权法:把画面分成多个区域,中心区域权重大,边缘权重小。这样拍人脸时,人脸亮度优先保证。
- 直方图统计法:统计直方图的分布特征,比如让直方图的众数落在某个区间,或者让累积分布达到某个百分比。
我的经验:在安防场景中,我习惯用区域加权法。把画面分成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就只统计人脸框内的像素,框外直接忽略。
实现上分三步:
- ROI检测:通过人脸检测、目标检测或固定网格,确定感兴趣区域
- 区域权重分配:给每个ROI分配权重,比如人脸权重0.7,天空权重0.1
- 加权亮度计算:L_weighted = Σ(wi × Li) / Σ(wi)
2.3.3 曝光参数调整顺序
调整曝光参数时,顺序很重要。我一般遵循这个优先级:
| 优先级 | 调整参数 | 原因 |
|---|---|---|
| 1(优先) | 快门 | 不影响画质,只影响运动模糊 |
| 2 | 光圈(如果可调) | 影响景深,但画质损失小 |
| 3(最后) | ISO | 放大噪声,能不用就不用 |
说白了就是:先调不影响画质的,再调有副作用的。如果快门已经快到极限(比如1/10000s)画面还是过曝,那就只能缩光圈或降ISO。反过来,如果快门已经慢到手持极限(1/30s)画面还暗,那就只能提ISO了。
2.4 AE控制流程图
下面这张图,是我自己总结的AE控制流程。你看一遍就能明白整个闭环是怎么跑的。
这个流程里有个关键点:阈值。如果误差小于阈值,就不调整参数,避免画面频繁闪烁。我一般把阈值设为5~8(8bit范围),这样画面亮度在小范围内波动时,人眼是感觉不到的。
2.5 避坑指南
最后分享几个我踩过的坑:
- 不要用固定步长:误差大时步长大,误差小时步长小。固定步长要么收敛慢,要么来回震荡。
- 注意曝光收敛速度:从暗场景切到亮场景,如果收敛太快,画面会闪一下;太慢,用户会等得不耐烦。我一般控制在3~5帧内完成收敛。
- 小心低帧率下的AE:如果帧率只有15fps,AE调整周期太长,画面亮度变化会一卡一卡的。这时候需要做帧间平滑。