AE算法核心框架:从统计到曝光的闭环
AE算法,说白了就是一套自动决定曝光参数的规则。它得回答三个问题:现在亮不亮?目标要多亮?怎么调过去?这三个问题串起来,就是AE的完整流程。
我刚开始接触AE时,以为就是算个平均亮度然后调增益。后来发现,真实场景远比想象复杂——逆光、高动态、闪烁光源,每个都能让简单策略崩掉。嗯,咱们今天就把这套框架拆开看。
AE算法整体流程:三步走闭环
AE的运转逻辑其实很直观。每次帧中断到来,它做三件事:
- 采集统计信息——从RAW域或YUV域拉出亮度数据
- 计算当前亮度——把统计信息映射成一个或几个亮度指标
- 调整曝光参数——对比目标亮度,算出新的曝光时间、增益、光圈
这三步循环往复,形成闭环。我画了张图,你看一眼就明白:
这个闭环每帧跑一次。你想想看,如果场景突然变暗,传感器输出变暗 → 统计值偏低 → 算法发现亮度不够 → 增加曝光时间或增益 → 下一帧变亮。就这么简单。
统计信息采集:算法的眼睛
统计信息是AE的输入。没有准确的统计,后面全是瞎调。常用的统计手段有两种:亮度直方图和分区统计。
亮度直方图
直方图把亮度从0到255分成256个bin,统计每个bin有多少像素。它能告诉你:
- 画面整体偏暗还是偏亮
- 有没有过曝或欠曝的区域
- 动态范围是否被充分利用
举个例子,一个正常曝光的室外场景,直方图应该像座小山,中间高两边低。如果所有像素都挤在左边(低亮度),说明欠曝了。
关键指标:我习惯关注直方图的 P10 和 P90 分位点。P10 代表暗部,P90 代表亮部。如果 P90 低于 200,说明画面偏暗;如果 P10 高于 50,说明暗部提得太亮,可能引入噪声。
分区统计
直方图只能看全局,分区统计能看局部。我们把画面分成 M×N 个格子,每个格子独立统计平均亮度。常见的分区方案有:
| 分区方案 | 格子数 | 适用场景 |
|---|---|---|
| 3×3 | 9 | 简单场景,人脸居中 |
| 5×5 | 25 | 通用场景,兼顾性能和精度 |
| 7×7 | 49 | 高精度场景,逆光检测 |
| 15×15 | 225 | AI辅助AE,逐区域权重 |
分区统计最大的好处是能识别局部过曝或欠曝。比如逆光人像,人脸区域(通常在中部)亮度低,背景亮度高。如果只看全局平均,算法会认为画面偏亮而降低曝光,结果人脸更暗。分区统计就能单独给中部区域更高权重。
目标亮度设定:AE的锚点
目标亮度就是AE想达到的“理想亮度”。它不是一个固定值,而是根据场景动态调整的。常见的设定方式有:
- 固定目标:比如始终把画面平均亮度控制在 128(8-bit 中灰)。简单,但适应性差。
- 场景自适应:根据直方图分布、人脸检测、场景分类来动态调整目标。比如夜景目标可以低一些,避免噪声;白天目标可以高一些,充分利用动态范围。
- 用户偏好:允许用户通过 EV 补偿旋钮微调目标亮度。这个后面会细说。
我个人习惯的做法是:先设定一个基础目标(比如 120),然后根据场景分类做偏移。检测到人脸时,把目标提高 10-20,让人脸更亮;检测到夜景时,把目标降低 20-30,避免暗部噪声被放大。
曝光补偿机制:给用户一个旋钮
曝光补偿(EV Compensation)是AE里最人性化的设计。它允许用户在自动曝光的基础上,手动微调亮度。说白了,就是告诉算法:我觉得你调的太暗了,给我亮一点。
补偿的实现方式很简单:在目标亮度上叠加一个偏移量。比如:
// 伪代码:曝光补偿实现
target_luminance = base_target + ev_compensation * step_per_ev
// 例如:base_target = 120, ev_compensation = +1.0 EV, step_per_ev = 30
// 则实际目标亮度 = 120 + 1.0 * 30 = 150
补偿范围通常是 ±3 EV,步长 0.25 EV 或 0.5 EV。用户每拨一格,目标亮度就偏移一段。
这里有个细节要注意:补偿不是直接调增益,而是调目标亮度。算法会通过调整曝光时间、增益、光圈来达到新的目标。这样做的优点是,补偿后的画面仍然保持自动曝光的平滑性,不会出现突变。
本章小结:框架就是三板斧
AE算法核心框架,说白了就是三板斧:
- 统计采集——直方图看全局,分区看局部
- 目标设定——固定值打底,场景自适应调优
- 曝光补偿——给用户一个旋钮,微调目标亮度