2、自动曝光(AE)基础原理

自动曝光,简称 AE,是 ISP 3A 里最“接地气”的一环。为什么这么说?因为用户拿到手机,第一眼看的不是噪点多少,而是画面亮不亮、暗不暗。曝光没做好,后面降噪、锐化做得再好,用户也会觉得“这摄像头不行”。

我个人习惯把 AE 比作一个“光量管家”。它的任务就一个:让传感器接受到的光量,刚好能拍出一张既不过曝也不欠曝的图。听起来简单,但实际做起来,坑不少。

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

要理解 AE,先得搞懂它手里的三张牌——光圈、快门、增益。这三者共同决定了最终图像的亮度。

要素 物理含义 对图像的影响 ISP 中的控制方式
光圈 (Aperture) 镜头通光孔径的大小 控制进光量,影响景深 通常固定(手机),或通过马达调节(部分模组)
快门 (Shutter) 传感器感光的时间长度 控制进光量,影响运动模糊 寄存器配置曝光行数(Exposure Lines)
增益 (Gain) 对电信号的放大倍数 提升亮度,但放大噪声 模拟增益(Analog Gain)+ 数字增益(Digital Gain)

这里我想多说一句。很多刚入行的朋友容易把“增益”当成万能药。觉得画面暗了,直接拉增益就行。我在项目中遇到过这样的案例:某款夜视摄像头,为了省成本用了小光圈传感器,结果 AE 算法为了把亮度拉到目标值,把增益推到了 8 倍以上。画面是亮了,但满屏都是彩色噪点,根本没法看。

所以,增益是最后的手段。能调快门、能开光圈,就别轻易动增益。

2.1.1 光圈

在手机 ISP 里,光圈通常是固定的。你想想看,手机镜头就那么薄,机械光圈很难塞进去。所以对于手机 AE 来说,光圈基本是个常量。但在安防监控、车载摄像头里,光圈是可调的。这时候 AE 策略会优先开大光圈,因为光圈不影响帧率,也不引入噪声。

2.1.2 快门

快门是 AE 最常用的调节手段。它的本质是控制传感器“曝光行数”。

举个例子,一个 30fps 的视频流,每帧时间约 33ms。如果我把快门设为 10ms,那传感器只感光 10ms,剩下的 23ms 在读取数据。如果我把快门设为 30ms,那感光时间就长了,画面更亮,但帧率可能掉到 30fps 以下。

嗯,这里要注意:快门不能无限长。在手持拍摄场景下,快门超过 1/30s 就容易拍糊。我建议在 AE 策略里给快门设一个上限,比如 30ms,超过这个值就优先调增益。

2.1.3 增益

增益分两段:模拟增益和数字增益。

  • 模拟增益:在传感器读出电路之前放大信号。它放大的信号和噪声是“一起放大”的,但噪声增加幅度相对可控。
  • 数字增益:在 ADC 转换之后,对数字域的信号做乘法。它会把量化噪声也一起放大,效果比模拟增益差。

我个人的经验是:优先用模拟增益,模拟增益用完了再用数字增益。而且数字增益最好不要超过 2 倍,否则画质下降很明显。

核心原则: AE 调节的优先级顺序是:
光圈(如果可调)→ 快门(不超过安全快门)→ 模拟增益 → 数字增益。

2.2 AE 的目标与评价标准

AE 不是“越亮越好”,也不是“越暗越好”。它有一个明确的目标:让图像的平均亮度落在某个期望范围内。这个期望范围,我们叫它“目标亮度”。

2.2.1 目标亮度

目标亮度通常用一个 8 位灰度值来表示,比如 100~120(0 是全黑,255 是全白)。为什么是这个范围?因为人眼对中间调最敏感,太亮或太暗都会丢失细节。

在实际项目中,目标亮度不是固定的。我做过一个行车记录仪的项目,白天目标亮度设在 110,晚上自动降到 80。为什么?因为晚上场景动态范围大,如果目标亮度设太高,车灯区域会过曝,车牌都看不清。

目标亮度的设定,通常基于图像的 亮度直方图。AE 算法会统计当前帧的直方图,计算平均亮度或中值亮度,然后与目标亮度比较,算出偏差。

小技巧: 不要只用平均亮度。如果画面中有大面积天空或地面,平均亮度会失真。我建议用“加权平均”,给画面中心区域更高的权重,因为那里通常是主体。

2.2.2 信噪比(SNR)

信噪比是 AE 的另一个评价标准。说白了,就是“信号”和“噪声”的比值。信噪比越高,画面越干净。

信噪比和曝光量直接相关。曝光量越大,信号越强,信噪比越高。但曝光量受限于快门和增益。你想想看,在暗光环境下,为了达到目标亮度,AE 不得不拉高增益,结果信噪比就下降了。

所以,AE 其实是在做一道“平衡题”:

  • 目标亮度:要求画面不能太暗。
  • 信噪比:要求画面不能太噪。
  • 运动模糊:要求快门不能太慢。

这三者互相制约。我曾经在一个低光视频项目中,为了抑制运动模糊,把快门锁死在 1/60s,结果增益被拉到 12dB,画面噪点爆炸。后来我调整了策略:在低光下,允许快门降到 1/30s,优先保证信噪比,运动模糊靠后处理去补偿。

避坑指南: 我曾经犯过一个错误——只盯着目标亮度调 AE,忽略了信噪比。结果画面亮度是达标了,但噪声大到用户投诉。后来我在 AE 评价函数里加了一个“噪声惩罚项”,当增益超过某个阈值时,适当降低目标亮度,换取更好的信噪比。

2.3 AE 的核心逻辑:曝光三角的权衡

把上面说的总结一下,AE 的核心逻辑就是“曝光三角”的权衡。我画了一张图,帮你直观理解。

AE 曝光三角权衡图 目标亮度 信噪比 (SNR) 运动模糊 AE 策略权衡 说明: AE 策略需要在三个目标之间做权衡: 1. 保证目标亮度 → 调节快门/增益 2. 保证信噪比 → 限制增益上限 3. 避免运动模糊 → 限制快门上限

从图上你能看到,AE 策略处于中心位置,它需要同时照顾三个方向。任何一个方向走极端,都会导致另外两个方向出问题。

2.4 AE 的评价函数

在实际的 ISP 代码里,AE 不是靠“感觉”来调的,而是靠一个评价函数。这个函数把目标亮度、信噪比、运动模糊等指标量化成一个数值,AE 算法通过调整曝光参数,让这个数值最小化。

一个简化的 AE 评价函数长这样:

// 简化的 AE 评价函数
float ae_cost_function(float current_luminance, float target_luminance,
                       float current_gain, float max_gain,
                       float current_shutter, float max_shutter) {
    // 1. 亮度偏差惩罚
    float luminance_error = fabs(current_luminance - target_luminance);
    float luminance_cost = luminance_error * 0.5f;

    // 2. 增益过高惩罚(信噪比下降)
    float gain_ratio = current_gain / max_gain;
    float gain_cost = (gain_ratio > 0.8f) ? (gain_ratio - 0.8f) * 10.0f : 0.0f;

    // 3. 快门过慢惩罚(运动模糊风险)
    float shutter_ratio = current_shutter / max_shutter;
    float shutter_cost = (shutter_ratio > 0.9f) ? (shutter_ratio - 0.9f) * 5.0f : 0.0f;

    // 总代价
    return luminance_cost + gain_cost + shutter_cost;
}

这段代码虽然简单,但核心思想是通用的。你想想看,AE 算法就是在搜索空间里,找到一组(快门,增益)参数,让这个 cost 函数的值最小。

经验之谈: 权重系数(0.5、10.0、5.0)需要根据实际场景调优。我一般会在实验室里用不同的光照条件跑一遍,记录下 cost 函数的输出,然后手动调整权重,直到 AE 的行为符合预期。

2.5 本章小结

自动曝光不是简单的“亮了调暗、暗了调亮”。它是在光圈、快门、增益三个维度上,平衡目标亮度、信噪比和运动模糊的复杂过程。

记住几个关键点:

  • 曝光三要素:光圈(固定居多)、快门(优先调)、增益(最后用)。
  • AE 目标:让图像亮度落在目标范围内,同时保证信噪比可接受。
  • 评价函数:把多个目标量化成一个数值,AE 算法去最小化它。
  • 避坑:别盲目拉增益,别让快门超过安全阈值。