2. AE(自动曝光)基本原理:曝光三角、亮度统计直方图与目标亮度设定
自动曝光(AE,Auto Exposure)是相机成像链路中最基础的闭环控制模块之一。其核心目标是在不同光照场景下,通过调节曝光参数组合,使传感器捕获的图像亮度稳定在预设的“目标亮度”附近,避免过曝(高光溢出)或欠曝(暗部细节丢失)。本章从曝光三角的物理原理出发,逐步深入到高通平台上的亮度统计直方图机制与目标亮度设定策略。
2.1 曝光三角:光圈、快门、ISO
曝光三角是决定传感器接收光量的三个核心参数。三者的物理意义与调节效果如下表所示:
| 参数 | 物理含义 | 对进光量的影响 | 副作用/限制 |
|---|---|---|---|
| 光圈(Aperture) | 镜头通光孔径的大小,用 F 数表示(F1.4、F2.0 等) | F 数越小,进光量越大;F 数每增大 √2 倍,进光量减半 | 影响景深(浅景深/背景虚化)和镜头衍射 |
| 快门(Shutter Speed) | 传感器感光的时间长度,单位秒(1/30s、1/60s 等) | 时间越长,进光量越大;时间减半,进光量减半 | 影响运动模糊(手抖/物体移动)和帧率 |
| ISO(感光度) | 传感器信号放大的增益倍数 | ISO 每翻倍,亮度信号放大一倍 | 放大噪声,降低信噪比(SNR),影响画质 |
高通平台提示: 在移动端 Camera 中,光圈通常是固定的(如 F1.8),因此 AE 策略主要调节快门和 ISO。部分高端模组支持可变光圈(如 F1.4-F4.0),此时光圈会作为 AE 的优先调节维度之一。
曝光三角的调节优先级在不同场景下有所不同。典型的 AE 策略优先级如下:
- 低光照场景: 优先降低快门速度(不超过安全快门),再提升 ISO,最后考虑开大光圈(若支持)。
- 高光照场景: 优先降低 ISO 至最小值(如 ISO 100),再提高快门速度,最后缩小光圈。
- 运动场景: 优先保证快门速度足够快(如 1/120s 以上),再调节 ISO 和光圈。
2.2 亮度统计直方图
亮度统计直方图(Luma Histogram)是 AE 算法判断当前场景亮度分布的核心工具。它将图像亮度从 0(纯黑)到 255(纯白)划分为 256 个 bin,统计每个亮度级别下的像素数量。高通平台通常提供多种统计模式,包括全局直方图、分区直方图(如 5x5 网格)和 Y 通道直方图。
直方图在 AE 调试中的典型应用场景:
- 过曝检测: 如果直方图右侧(高亮区域)出现大量像素堆积且接近 255,说明存在高光溢出风险。
- 欠曝检测: 如果直方图左侧(暗部区域)大量像素堆积在 0 附近,说明暗部细节丢失。
- 场景分类: 直方图分布形态可辅助判断场景类型(如夜景、逆光、室内均匀光等)。
高通平台特性: 高通 ISP 的统计引擎(Stats Engine)支持输出 256-bin 的 Y 直方图,同时提供分区统计(如 15x15 网格的均值/方差)。在 AE 算法中,通常先计算全局直方图的加权平均亮度,再结合分区信息做局部曝光补偿。
2.3 目标亮度设定
目标亮度(Target Luma)是 AE 算法期望图像达到的平均亮度水平,通常用 Y 通道的均值或加权均值表示。在高通平台中,目标亮度一般设定在 100-120(8-bit 范围)之间,对应 18% 中性灰卡的反射率。
目标亮度的设定需要考虑以下因素:
- 场景类型: 夜景场景目标亮度可适当降低(如 80-100),避免噪声放大;户外强光场景可适当提高(如 120-140)。
- 人脸检测: 当检测到人脸时,AE 会以人脸区域亮度为主要参考,目标亮度通常设定在 130-150 之间,确保肤色自然。
- HDR 模式: 在 HDR 模式下,目标亮度会适当降低(如 90-110),为高光区域预留更多动态范围。
调试注意: 目标亮度不是固定值,而是需要根据模组特性(如 sensor 的线性度、ISP 的 tone mapping 曲线)进行微调。过高的目标亮度会导致高光区域饱和,过低则导致暗部噪声明显。建议在标准 D65 光源下,使用灰卡标定初始目标亮度值。
2.4 高通平台 AE 统计与目标亮度映射
在高通 Camera 子系统中,AE 统计数据的获取与目标亮度的映射关系如下:
| 统计模块 | 输出数据 | 用途 |
|---|---|---|
| Y 直方图(Histogram) | 256-bin 亮度分布 | 计算全局平均亮度、过曝/欠曝比例 |
| 分区统计(Grid Stats) | MxN 网格的 Y 均值/方差 | 局部曝光补偿、背光检测 |
| 人脸统计(Face Stats) | 人脸 ROI 内的亮度均值 | 人脸优先曝光 |
| AE 收敛状态 | 当前亮度与目标亮度的差值 | PID 控制器调节步长 |
目标亮度映射到实际曝光参数的典型计算过程(伪代码):
// 高通平台 AE 目标亮度映射示例
// 输入:当前统计亮度 current_luma, 目标亮度 target_luma
// 输出:快门增益 shutter_gain, ISO 增益 iso_gain
float luma_error = target_luma - current_luma;
float exposure_gain = 1.0 + (luma_error / target_luma) * Kp; // Kp 为比例系数
// 根据曝光增益调节快门和 ISO
if (exposure_gain > 1.0) {
// 需要增加曝光:优先降低快门速度
shutter_gain = min(shutter_gain * exposure_gain, max_shutter_gain);
// 如果快门已达上限,再提升 ISO
if (shutter_gain >= max_shutter_gain) {
iso_gain = min(iso_gain * exposure_gain, max_iso_gain);
}
} else {
// 需要减少曝光:优先降低 ISO
iso_gain = max(iso_gain * exposure_gain, min_iso_gain);
// 如果 ISO 已达下限,再提高快门速度
if (iso_gain <= min_iso_gain) {
shutter_gain = max(shutter_gain * exposure_gain, min_shutter_gain);
}
}
实战建议: 在调试初期,建议先固定目标亮度为 110(8-bit),然后通过抓取不同场景下的直方图分布,观察实际亮度是否收敛到目标值附近。如果发现系统存在稳态误差(如始终偏暗 5-10 个亮度值),可以通过调整 PID 控制器的积分项(Ki)来消除。