自动曝光(AE)基础:曝光三要素与收敛目标

各位同学,今天我们来聊聊自动曝光(AE)的基础。说实话,AE 是 ISP 里最“接地气”的模块——你拿起手机拍照,画面忽明忽暗,用户第一反应就是“这相机不行”。我当年调试第一款手机摄像头时,就被 AE 的收敛速度坑过,画面来回震荡,像在呼吸一样。嗯,从那以后我就明白,搞懂 AE 基础,比调参数更重要。

曝光三要素:光圈、快门、增益

曝光,说白了就是控制传感器接受到的光量。三个核心参数,缺一不可。

要素 物理含义 对画面的影响 典型范围
光圈(Aperture) 镜头通光孔径大小 控制进光量 + 景深 F/1.4 ~ F/16
快门(Shutter) 传感器曝光时间 控制进光量 + 运动模糊 1/10000s ~ 30s
增益(Gain/ISO) 模拟/数字信号放大倍数 控制亮度 + 噪声 ISO 100 ~ 6400

这里有个关键点:光圈在手机上是固定的。你想想看,手机镜头那么小,F/1.8 基本就是极限了。所以手机 AE 真正能调的,只有快门和增益。我做过一个项目,客户非要手机实现“光圈优先”模式,最后只能靠 ND 滤镜模拟,效果嘛……凑合能用。

核心公式:曝光量 ∝ 光圈面积 × 快门时间 × 增益

用对数表示:EV = log₂(F²/T) + log₂(ISO/100)

其中 EV 是曝光值,F 是光圈数,T 是快门时间(秒)。

曝光模型与亮度统计

AE 不是瞎猜的,它背后有一套数学模型。我个人习惯把曝光模型分成三层:

  1. 物理层:传感器响应曲线(光子 → 电子 → 数字码值)
  2. 统计层:图像亮度直方图、分区统计
  3. 控制层:PID 或查表法调整三要素

亮度统计是 AE 的眼睛。传感器输出的 RAW 数据,经过黑电平校正后,我们会计算每个像素的亮度值。但注意,不是所有像素都参与统计——我一般会去掉最暗的 1% 和最亮的 1%,避免死黑和过曝点干扰判断。

我的经验:分区加权统计比全局平均更靠谱。把画面分成 5×5 或 7×7 的网格,人脸区域给高权重,天空区域给低权重。这样逆光场景下,人脸不会黑成一片。

举个例子,一个典型的亮度统计流程:

// 伪代码:亮度统计
uint32_t hist[256] = {0};
for (each pixel in ROI) {
    uint8_t luma = (pixel.r * 0.299 + pixel.g * 0.587 + pixel.b * 0.114);
    hist[luma]++;
}
// 计算加权平均亮度
float avg_luma = 0;
for (int i = 0; i < 256; i++) {
    avg_luma += i * hist[i] * weight[i];
}
avg_luma /= total_pixels;

这段代码看着简单,但实际工程里坑不少。我曾经遇到过一个问题:统计 ROI 没对齐,导致画面边缘的强光源被计入,AE 一直压曝光,画面越来越暗。后来加了边缘裁剪,问题才解决。

AE 的收敛目标:目标亮度

AE 不是“越亮越好”,而是“亮到合适”。这个“合适”就是目标亮度(Target Luma)。

目标亮度通常是一个 8-bit 值,范围 0~255。我见过的大多数方案,目标亮度设在 100~120 之间。为什么是这个范围?因为人眼对中间调最敏感,太亮会刺眼,太暗看不清细节。

注意:目标亮度不是固定值!

  • 低光照场景:目标亮度可以降到 80,避免增益过高引入噪声
  • 高动态场景:目标亮度可以升到 130,保留暗部细节
  • 人脸检测时:人脸区域的目标亮度单独设定,通常 140~160

我调试过一款安防摄像头,客户要求夜间也能看清车牌。一开始目标亮度设 110,结果增益拉到 ISO 3200,画面全是噪点。后来我把目标亮度降到 85,快门放慢到 1/30s,增益控制在 ISO 800 以内,画面干净多了。说白了,目标亮度是 AE 的“锚点”,锚点选错了,后面调啥都白搭。

知识结构图:AE 核心逻辑

下面这张图,是我自己画的一个 AE 核心逻辑框架。你看一眼,基本就能理解 AE 是怎么工作的。

自动曝光(AE)核心逻辑框架 传感器 RAW 数据 亮度统计(分区加权) 与目标亮度比较 AE 收敛决策(PID/查表) 调整快门 / 增益 反馈闭环 关键参数 • 目标亮度:100~120 • 分区权重:人脸优先 • 收敛速度:避免震荡

这张图里,我特意画了一个反馈闭环。你想想看,AE 不是一次就调好的——它先统计亮度,跟目标比,然后调参数,再统计,再比……直到误差小于某个阈值。这个收敛过程,我一般控制在 5~10 帧 内完成。太快会震荡,太慢用户能感知到亮度变化,体验很差。

避坑指南:AE 调试中的常见问题

  • 亮度震荡:我曾经把 PID 的 P 值设太大,画面在亮暗之间来回跳。后来加了死区(deadband),误差小于 3 就不调,问题解决。
  • 过曝锁定:强光场景下,AE 可能把快门压到极限,画面还是过曝。这时候要检查传感器是否支持更短快门,或者考虑加电子 ND。
  • 暗光闪烁:低光照下,增益太高会导致 50/60Hz 工频闪烁。我一般会限制快门为工频周期的整数倍(比如 1/50s 或 1/100s)。

一个小技巧:调试 AE 时,先把增益固定为 ISO 100,只调快门。等快门范围用尽了,再引入增益。这样能清晰看到每个参数的影响,避免耦合问题。