AE算法核心框架:从统计到曝光的闭环

AE算法,说白了就是一套自动决定曝光参数的规则。它得回答三个问题:现在亮不亮?目标要多亮?怎么调过去?这三个问题串起来,就是AE的完整流程。

我刚开始接触AE时,以为就是算个平均亮度然后调增益。后来发现,真实场景远比想象复杂——逆光、高动态、闪烁光源,每个都能让简单策略崩掉。嗯,咱们今天就把这套框架拆开看。

AE算法整体流程:三步走闭环

AE的运转逻辑其实很直观。每次帧中断到来,它做三件事:

  1. 采集统计信息——从RAW域或YUV域拉出亮度数据
  2. 计算当前亮度——把统计信息映射成一个或几个亮度指标
  3. 调整曝光参数——对比目标亮度,算出新的曝光时间、增益、光圈

这三步循环往复,形成闭环。我画了张图,你看一眼就明白:

AE算法闭环流程图 AE算法闭环流程 传感器 RAW 数据 统计信息采集(直方图/分区) 当前亮度计算 + 目标对比 曝光参数调整(ET/增益/光圈) 下一帧 闭环周期 = 1 帧时间(通常 16.67ms @60fps),每次帧中断触发一次 AE 更新

这个闭环每帧跑一次。你想想看,如果场景突然变暗,传感器输出变暗 → 统计值偏低 → 算法发现亮度不够 → 增加曝光时间或增益 → 下一帧变亮。就这么简单。

我的经验:闭环的响应速度取决于你允许每帧调整多少。调太快会闪烁,调太慢会拖影。我一般把最大步长限制在 ±1/3 EV 每帧,兼顾平滑和响应。

统计信息采集:算法的眼睛

统计信息是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,逐区域权重

分区统计最大的好处是能识别局部过曝或欠曝。比如逆光人像,人脸区域(通常在中部)亮度低,背景亮度高。如果只看全局平均,算法会认为画面偏亮而降低曝光,结果人脸更暗。分区统计就能单独给中部区域更高权重。

避坑指南:我曾经在一个项目中用了 15×15 分区,结果每帧要处理 225 个区域的统计值,ISP 带宽直接被打满。后来改成 5×5,效果差不多,但负载降了 90%。分区不是越多越好,够用就行。

目标亮度设定:AE的锚点

目标亮度就是AE想达到的“理想亮度”。它不是一个固定值,而是根据场景动态调整的。常见的设定方式有:

  • 固定目标:比如始终把画面平均亮度控制在 128(8-bit 中灰)。简单,但适应性差。
  • 场景自适应:根据直方图分布、人脸检测、场景分类来动态调整目标。比如夜景目标可以低一些,避免噪声;白天目标可以高一些,充分利用动态范围。
  • 用户偏好:允许用户通过 EV 补偿旋钮微调目标亮度。这个后面会细说。

我个人习惯的做法是:先设定一个基础目标(比如 120),然后根据场景分类做偏移。检测到人脸时,把目标提高 10-20,让人脸更亮;检测到夜景时,把目标降低 20-30,避免暗部噪声被放大。

小技巧:目标亮度不要用单一值,可以用一个目标区间。比如 [110, 130],只要当前亮度落在这个区间内,就不调整参数。这样可以避免在稳定场景下反复微调,减少闪烁。

曝光补偿机制:给用户一个旋钮

曝光补偿(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。用户每拨一格,目标亮度就偏移一段。

这里有个细节要注意:补偿不是直接调增益,而是调目标亮度。算法会通过调整曝光时间、增益、光圈来达到新的目标。这样做的优点是,补偿后的画面仍然保持自动曝光的平滑性,不会出现突变。

我曾经踩过的坑:有个项目把补偿直接加到了增益上,结果用户拨到 +3 EV 时,增益飙到 32x,画面全是噪声。后来改成调目标亮度,让算法自己去分配曝光时间和增益,噪声问题就解决了。记住:补偿是告诉算法“我要多亮”,而不是“我要多强的增益”。

本章小结:框架就是三板斧

AE算法核心框架,说白了就是三板斧:

  1. 统计采集——直方图看全局,分区看局部
  2. 目标设定——固定值打底,场景自适应调优
  3. 曝光补偿——给用户一个旋钮,微调目标亮度