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)是调节亮度的两个旋钮,但它们对画质的影响完全不同。

先看一张我常用的调节策略流程图:

AE曝光时间与增益协同调节策略 计算当前亮度误差 误差 > 阈值? 优先调节曝光时间 时间到上限? 再调节模拟增益 更新寄存器,等待下一帧 调节优先级 1. 曝光时间(无损) 2. 模拟增益(低噪) 3. 数字增益(慎用)

这张图的核心逻辑是:先调时间,再调增益。为什么?

  • 曝光时间:延长曝光时间不引入额外噪声,但会带来运动模糊。手持拍摄超过1/30秒,糊片概率大增。
  • 模拟增益:放大信号的同时也放大噪声。增益每增加6dB(一倍),信噪比下降约6dB。
  • 数字增益:纯软件放大,噪声放大更明显。我一般只在模拟增益到上限(通常16x~32x)后才启用,而且会配合降噪强度联动。

避坑指南:我曾经在一个低光项目中,为了追求低噪声,把曝光时间拉到1/4秒,结果用户手持拍摄时画面全是重影。后来加了陀螺仪数据做运动检测,检测到运动时强制限制曝光时间不超过1/30秒,不足的亮度用增益补。效果好了很多。

2.4 实际调节流程:从误差到寄存器

AE的调节是一个闭环反馈过程。每一帧处理完,ISP统计模块会输出当前帧的亮度直方图或平均亮度,AE算法对比目标值,算出误差,然后决定下一帧的参数。

我常用的调节步骤:

  1. 计算亮度误差:error = target_mean - current_mean。正数表示偏暗,负数表示偏亮。
  2. 判断误差范围:如果|error| < 5(8bit域),认为已经收敛,不做调整。避免频繁抖动。
  3. 优先调曝光时间:按误差比例计算目标曝光时间,但不超过帧率限制(比如30fps对应最大33ms)。
  4. 时间到限后调增益:如果曝光时间已经到上限,误差还没消除,再计算需要的模拟增益值。
  5. 增益也到限?:如果模拟增益也到上限(比如32x),启用数字增益,同时通知降噪模块加强处理。
  6. 平滑过渡:不要一步到位。我习惯用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这块基本就稳了。