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 策略处于中心位置,它需要同时照顾三个方向。任何一个方向走极端,都会导致另外两个方向出问题。
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 算法去最小化它。
- 避坑:别盲目拉增益,别让快门超过安全阈值。