2. AE自动曝光:测光原理、目标亮度设定、曝光时间与增益的协同调节
自动曝光(AE)是3A算法里最贴近用户感知的一环。你拿起手机拍照,画面忽明忽暗,第一反应就是AE没调好。我做了这么多年ISP,见过太多因为AE策略翻车的案例——明明传感器很强,出来的画面却要么过曝一片死白,要么暗部全是噪点。
说白了,AE要解决的就三个问题:测哪里、测多少、怎么调。下面我们一个一个拆开讲。
2.1 测光原理:你究竟想测哪里?
测光不是把整帧图像的平均亮度算出来就完事。不同的场景,关注区域完全不同。比如拍人脸,你得盯着皮肤区域;拍风景,天空和地面的权重就不一样。
常见的测光模式有三种,我列个表对比一下:
| 测光模式 | 核心思路 | 适用场景 | 我踩过的坑 |
|---|---|---|---|
| 全局平均测光 | 全图像素亮度取平均 | 光照均匀的风景、文档拍摄 | 逆光时人脸全黑,背景却正常 |
| 中央重点测光 | 中心区域权重高,边缘衰减 | 人像、主体居中的场景 | 主体偏移中心时直接翻车 |
| 点测光/局部测光 | 只取一个小区域(如2%~10%画面) | 舞台追光、微距、高反差场景 | 测光点选在反光物体上,画面直接过曝 |
关键认知:没有万能的测光模式。我习惯在AE模块里同时计算多种测光结果,然后根据场景分类器(比如人脸检测、运动检测)动态切换权重。这样比固定一种模式灵活得多。
实际项目中,我们还会用到多区域加权测光。把画面分成M×N个网格,每个网格独立计算亮度,再根据场景语义给不同网格分配权重。比如检测到人脸,人脸区域的权重直接拉高到0.7以上,其他区域共享剩下的0.3。
2.2 目标亮度设定:多亮才算“正常”?
测光拿到了当前亮度值,接下来得有个目标。目标亮度通常用一个目标平均像素值(Target Mean)来表示,单位是8bit灰度值(0~255)。
行业内常见的设定范围是100~140。为什么是这个范围?
- 低于100:画面偏暗,暗部细节虽然保留,但整体观感“欠曝”,用户会下意识调高屏幕亮度。
- 高于140:高光区域容易溢出(超过235),蓝天变白纸,人脸额头反光成一团。
- 100~140之间:兼顾了中间调细节和高光保留,是大多数场景的“甜区”。
我的经验:不要死磕固定目标值。我在做安防摄像头项目时,白天目标设120,晚上自动降到90。因为夜间场景信噪比差,强行拉到120会引入大量噪点,还不如保留暗部氛围,让降噪算法去处理。
目标亮度的设定还要考虑Gamma曲线和色调映射(Tone Mapping)。如果ISP后端有很强的Tone Mapping,AE可以适当降低目标值,把动态范围留给后端去拉伸。反之,如果后端处理能力弱,AE就得把目标值拉高,保证直出画面可用。
2.3 曝光时间与增益的协同调节
这是AE最核心的工程问题。曝光时间(Exposure Time)和模拟增益(Analog Gain)是调节亮度的两个旋钮,但它们对画质的影响完全不同。
先看一张我常用的调节策略流程图:
这张图的核心逻辑是:先调时间,再调增益。为什么?
- 曝光时间:延长曝光时间不引入额外噪声,但会带来运动模糊。手持拍摄超过1/30秒,糊片概率大增。
- 模拟增益:放大信号的同时也放大噪声。增益每增加6dB(一倍),信噪比下降约6dB。
- 数字增益:纯软件放大,噪声放大更明显。我一般只在模拟增益到上限(通常16x~32x)后才启用,而且会配合降噪强度联动。
避坑指南:我曾经在一个低光项目中,为了追求低噪声,把曝光时间拉到1/4秒,结果用户手持拍摄时画面全是重影。后来加了陀螺仪数据做运动检测,检测到运动时强制限制曝光时间不超过1/30秒,不足的亮度用增益补。效果好了很多。
2.4 实际调节流程:从误差到寄存器
AE的调节是一个闭环反馈过程。每一帧处理完,ISP统计模块会输出当前帧的亮度直方图或平均亮度,AE算法对比目标值,算出误差,然后决定下一帧的参数。
我常用的调节步骤:
- 计算亮度误差:
error = target_mean - current_mean。正数表示偏暗,负数表示偏亮。 - 判断误差范围:如果
|error| < 5(8bit域),认为已经收敛,不做调整。避免频繁抖动。 - 优先调曝光时间:按误差比例计算目标曝光时间,但不超过帧率限制(比如30fps对应最大33ms)。
- 时间到限后调增益:如果曝光时间已经到上限,误差还没消除,再计算需要的模拟增益值。
- 增益也到限?:如果模拟增益也到上限(比如32x),启用数字增益,同时通知降噪模块加强处理。
- 平滑过渡:不要一步到位。我习惯用IIR滤波器做参数平滑,
new_param = alpha * target_param + (1-alpha) * current_param,alpha取0.3~0.6,避免画面亮度突变。
核心原则:曝光时间负责“粗调”,增益负责“微调”。粗调要快,微调要稳。我见过有些方案把增益步长设得很大,结果画面一亮一暗来回震荡,用户体验极差。
2.5 增益分配的一个实际案例
假设场景亮度很低,目标亮度120,当前亮度只有30。误差90,需要提升4倍(2档)。
我的分配策略:
| 步骤 | 操作 | 曝光时间 | 模拟增益 | 数字增益 | 预期亮度 |
|---|---|---|---|---|---|
| 初始 | — | 1/60s (16.67ms) | 1x (0dB) | 1x | 30 |
| 第1步 | 延长曝光时间到上限 | 1/30s (33.33ms) | 1x | 1x | 60 |
| 第2步 | 提升模拟增益到2x | 1/30s | 2x (6dB) | 1x | 120 |
你看,两步就搞定了。如果第2步模拟增益到2x还不够,我会继续提,但不会超过16x。超过16x时,我会判断是否要降低帧率(比如从30fps降到15fps),换取更长的曝光时间。这又是一个权衡——流畅度 vs 亮度。
小技巧:我习惯在AE模块里维护一个“曝光表”,预计算好不同曝光时间和增益组合下的理论亮度。这样查表比实时计算快得多,尤其适合嵌入式平台。表的大小也就几十行,不占什么资源。
2.6 收敛速度与稳定性
AE调节不能太快,也不能太慢。太快了画面闪烁,太慢了用户等得不耐烦。
我一般这样控制:
- 大步长场景切换:如果连续两帧亮度变化超过30%,判定为场景切换,直接重置AE状态,用新场景的初始参数。
- 正常调节:每帧调节幅度不超过总调节量的20%。比如需要提升4倍,分5~6帧完成,每帧提升约1.2倍。
- 防抖机制:如果误差在正负之间来回跳,说明场景有高频闪烁(比如50Hz日光灯)。我会把调节步长减半,或者锁定参数2~3帧再重新评估。
嗯,这里要注意:AE的收敛速度要和AWB(自动白平衡)错开。如果AE和AWB同时大调,画面会又亮又偏色,用户一眼就能看出算法在“抽搐”。我习惯让AE先收敛,稳定后再启动AWB的精细调节。
好了,AE的核心逻辑就这些。测光选区域、目标定范围、时间优先增益兜底、平滑过渡防闪烁——把这四点吃透,AE这块基本就稳了。