3. AE算法核心
各位同学,今天我们来啃AE这块硬骨头。说白了,自动曝光就是让摄像头在任何光线下都能拍出“看着舒服”的画面。但“看着舒服”这四个字,背后全是工程细节。
我在高通Spectra平台上调AE时,最深的感受是:曝光不是算出来的,是“权衡”出来的。你既要保亮部细节,又要提暗部层次,还得防闪烁、防过曝。今天我把核心三板斧拆开讲:亮度统计、多帧HDR、防闪烁。
3.1 亮度统计与权重矩阵
AE的第一步,是知道画面到底有多亮。但你不能简单取全图平均——那样逆光人脸就全黑了。我习惯把传感器输出的RAW域数据,先做一次分区统计。
高通Spectra把画面分成15×15或33×33的网格,每个格子独立统计亮度均值。然后,给每个格子一个权重。权重矩阵长什么样?看下面这张图:
典型权重矩阵设计原则:
- 中央区域权重高(人脸通常在这里)
- 边缘区域权重低(天空、地面不重要)
- 过曝/欠曝区域自动降权(避免统计被极端值带偏)
权重矩阵不是死的。我做过一个项目,用户总抱怨拍文档时边缘发暗。后来我把边缘权重从0.3提到0.6,问题就解决了。说白了,权重矩阵就是你对“画面哪里重要”的主观表达。
我的经验:调试AE时,先固定权重矩阵,只调目标亮度。等画面整体亮度稳定了,再回头微调权重。否则两个变量一起动,你根本不知道问题出在哪。
3.2 多帧融合与HDR曝光策略
单帧曝光永远有天花板。高光压不住,暗部提不起。所以高通Spectra用多帧HDR来解决——连续拍几帧不同曝光的图,然后合成一帧。
常见的策略有三种:
| 策略 | 帧数 | 曝光组合 | 适用场景 |
|---|---|---|---|
| 2帧HDR | 2 | 长曝光 + 短曝光 | 逆光人像、室内窗边 |
| 3帧HDR | 3 | 长曝光 + 中曝光 + 短曝光 | 大光比场景(日落、夜景灯牌) |
| 交错HDR | 连续帧 | 逐帧交替不同曝光 | 视频HDR(实时性要求高) |
高通Spectra的厉害之处在于帧间对齐。多帧合成最怕运动鬼影——人动一下,合成出来就是重影。Spectra用硬件光流做运动补偿,把每帧的像素对齐到参考帧上。我测过,运动补偿延迟控制在1ms以内,基本看不出鬼影。
注意:多帧HDR不是帧数越多越好。3帧以上,运动补偿的算力开销会翻倍,而且帧率会掉。我建议:拍照用3帧,视频用2帧交错。别贪心。
曝光策略上,我习惯用自适应曝光步长。比如当前亮度离目标差2档,我就大步调曝光时间;差0.3档,就小步微调。高通Spectra的AE收敛曲线,我调过最快3帧内稳定——前提是场景不能突变。
3.3 防闪烁(Anti-Flicker)机制
这个问题,我当年踩过坑。在室内灯光下拍视频,画面一闪一闪的,用户投诉说“像迪斯科”。其实就是50Hz/60Hz工频闪烁——灯光以100Hz或120Hz的频率波动,而你的曝光时间没对齐。
防闪烁的核心逻辑很简单:让曝光时间是工频周期的整数倍。
- 50Hz地区(中国、欧洲):工频周期10ms,曝光时间设为10ms、20ms、30ms…
- 60Hz地区(美国、日本):工频周期8.33ms,曝光时间设为8.33ms、16.67ms、25ms…
高通Spectra的防闪烁模块,会自动检测当前光源频率。怎么检测?我告诉你:连续拍两帧,看亮度波动。如果波动频率接近100Hz,就判定为50Hz环境;接近120Hz,就是60Hz环境。
防闪烁的两种模式:
- 硬锁定:曝光时间严格锁定在工频整数倍。优点是彻底消除闪烁,缺点是曝光步长受限,可能过曝或欠曝。
- 软锁定:曝光时间尽量靠近整数倍,允许微小偏差。优点是曝光更灵活,缺点是闪烁可能残留一点点。
我个人习惯用软锁定。为什么?因为硬锁定在低光环境下太痛苦了——你想用15ms曝光,但15ms不是10ms的整数倍,硬锁定会把你拉到20ms,画面就过曝了。软锁定允许你用15.2ms,闪烁几乎看不出,但曝光准确多了。
避坑指南:我曾经在混合光源场景翻过车——一半是50Hz日光灯,一半是60Hz显示器。防闪烁模块检测到两个频率,直接懵了。后来我加了频率置信度投票:哪个频率的波动能量大,就锁定哪个。如果两个差不多,默认走50Hz(因为室内主光源通常是日光灯)。
最后说一句:防闪烁不是万能的。LED灯如果用了劣质驱动芯片,闪烁频率可能不是100Hz/120Hz,而是几百Hz甚至几千Hz。这种高频闪烁,防闪烁模块也救不了——只能靠硬件去频闪算法。嗯,那是另一个话题了。