第二章 自动曝光(AE)原理:曝光三角与测光体系
各位好,我是负责ISP 3A算法模块的工程师。今天咱们聊聊自动曝光(AE)——这个看似简单、实则坑最多的模块。
你想想看,一张照片好不好看,第一眼看的肯定是亮度。太暗了看不清细节,太亮了又刺眼。AE要做的,就是让画面亮度刚刚好。但问题来了:什么叫“刚刚好”?
2.1 曝光三角:光圈、快门、ISO
曝光控制,说白了就是控制进光量。三个参数互相制约,就像三角形的三条边——动一个,另外两个就得跟着调。
| 参数 | 物理含义 | 对画面的影响 | 高通平台常见范围 |
|---|---|---|---|
| 光圈 (Aperture) | 镜头通光孔径大小 | 控制进光量 + 景深 | f/1.4 ~ f/16(手机多为固定光圈) |
| 快门 (Shutter) | 传感器感光时间 | 控制进光量 + 运动模糊 | 1/10000s ~ 30s |
| ISO (增益) | 模拟/数字信号放大倍数 | 控制亮度 + 噪声水平 | ISO 50 ~ 12800 |
核心公式: 曝光量 ∝ 光圈面积 × 快门时间 × ISO增益
用对数表示就是:EV = log₂(F²/T) + log₂(ISO/100)
我在项目中遇到过一个问题:某款手机在夜景模式下,AE算法拼命拉ISO,结果画面噪点满天飞。后来我强制限制了ISO上限,同时延长快门时间——但快门太长又导致手抖模糊。嗯,这就是曝光三角的典型博弈。
2.2 测光模式:相机怎么看世界?
相机要决定“哪里亮才算亮”。不同的测光模式,决定了AE统计的权重分布。
- 全局测光(平均测光): 整幅画面取平均。适合光照均匀的场景。
- 中央重点测光: 画面中心区域权重高。适合人像、主体居中的场景。
- 点测光: 只取画面中心一个小区域(约1%~5%)。适合逆光、舞台等极端场景。
- 矩阵测光(评价测光): 将画面分成多个区域,分别计算后加权。高通平台默认模式。
我的经验: 高通平台上的矩阵测光,默认是16×16的网格。但如果你做AI场景识别,建议改成32×32甚至64×64——虽然计算量大了点,但能更精细地捕捉局部亮度变化。
2.3 亮度统计:AE的“眼睛”
AE算法需要知道当前画面有多亮。高通平台通过硬件统计模块(HAL3的AE统计)提供以下数据:
// 高通平台AE统计数据结构(简化版)
struct ae_stats {
uint32_t grid_width; // 统计网格宽度,通常16或32
uint32_t grid_height; // 统计网格高度
uint32_t *histogram; // 256级亮度直方图
uint32_t *grid_luma; // 每个网格的平均亮度值
uint32_t roi_weight; // 感兴趣区域权重
uint32_t saturated_pixels; // 过曝像素计数
uint32_t dark_pixels; // 欠曝像素计数
};
我个人习惯把亮度统计分成三个维度来看:
- 全局平均亮度: 整幅画面的平均Y值。简单,但容易被大块亮区/暗区带偏。
- 直方图分布: 看像素集中在哪个亮度区间。如果直方图右侧“撞墙”,说明过曝了。
- 区域权重: 人脸区域、对焦区域、天空区域……不同区域权重不同。
我曾经踩过的坑: 某次调试时,AE统计显示平均亮度只有80(0~255范围),但画面看起来已经过曝了。查了半天才发现——传感器输出的RAW数据是10bit的,而统计模块默认按8bit处理。高位截断导致亮度值偏低。所以,一定要确认统计模块的位宽和传感器输出位宽一致。
2.4 目标亮度设定:到底多亮才算“正常”?
目标亮度(Target Luminance)是AE的“指挥棒”。它告诉算法:把画面调到这个亮度水平。
但问题来了——不同场景的目标亮度不一样:
| 场景类型 | 目标亮度(Y值) | 说明 |
|---|---|---|
| 户外晴天 | 180~220 | 高亮度,保留高光细节 |
| 室内正常光 | 120~160 | 舒适亮度,兼顾暗部 |
| 夜景/暗光 | 60~100 | 低亮度,优先降噪 |
| 逆光人像 | 人脸区域140~180 | 人脸优先,背景可过曝 |
你想想看,如果夜景也按200的目标亮度去调,ISO会飙到多高?画面还能看吗?所以,目标亮度必须根据场景动态调整。
2.5 AE控制流程:从统计到决策
下面这张图展示了高通平台AE的完整闭环流程:
这个闭环每帧都在运行。高通平台通常每帧都会更新AE参数,但为了防抖,我建议加上一个低通滤波器——说白了就是让参数变化平滑一点,别一帧亮一帧暗。
2.6 避坑指南:高通平台AE调试常见问题
- 闪烁问题: 室内灯光下,快门时间如果和电网频率(50Hz/60Hz)不匹配,画面会闪烁。高通平台有anti-banding模块,记得开启。
- 收敛速度: 场景切换时,AE从暗到亮或从亮到暗的过渡时间。太快会闪烁,太慢用户觉得卡。我一般控制在5~10帧内完成。
- 过曝保护: 高亮区域(如太阳、灯光)容易过曝。高通平台支持高光权重调整——给高亮区域更高的权重,让AE优先保护高光细节。
- 人脸优先: 如果检测到人脸,AE应该以人脸区域的亮度为准。高通平台的人脸ROI权重可以单独配置。
我的调试小技巧: 在调试AE时,先把目标亮度设死(比如固定150),然后手动调整曝光参数,观察直方图变化。等摸清了传感器的响应曲线,再放开让AE自动跑。这样能快速定位问题是出在统计模块还是决策算法。