3. 3A算法基础(上):自动曝光(AE)原理

各位好,我是老张。在高通平台摸爬滚打了八年,经手了从骁龙820到8 Gen 3的十几款旗舰机,要说哪个模块最让人又爱又恨,我第一个投票给AE——自动曝光。

AE做得好,用户随手一拍就是好片;AE调不好,白天过曝、晚上死黑,用户直接骂娘。今天咱们就把AE的底裤扒干净,从原理到实战,一条龙讲透。

3.1 AE到底在干什么?

说白了,AE就是相机的"瞳孔"。人眼看亮处会缩瞳,看暗处会散瞳,AE干的是同一件事——根据场景亮度,自动调整三个参数:

  • 曝光时间(Exposure Time):传感器收集光的时间,单位毫秒或行数
  • 模拟增益(Analog Gain):传感器读出前的电压放大,单位dB
  • 数字增益(Digital Gain):ISP内部的数字放大,单位倍数

这三个参数组合起来,决定了最终图像的亮度。高通平台把这套机制封装在cam_ae_module里,我们调试时主要跟它打交道。

核心公式:

最终亮度 = 曝光时间 × 模拟增益 × 数字增益

这个公式贯穿整个AE调试,你调的任何参数最终都会落到这三个变量上。

3.2 AE收敛速度:快还是慢?

收敛速度,就是相机从当前亮度调整到目标亮度需要多少帧。我见过不少工程师一上来就问:"老张,收敛速度设多少合适?"

我的回答是:看场景。

高通平台通过AE Convergence Speed参数控制收敛速度,单位是"帧"。举个例子:

// 高通AE收敛速度配置示例
ae_convergence_speed = {
    .fast_speed = 5,      // 快速收敛:5帧完成
    .normal_speed = 15,   // 正常收敛:15帧完成
    .slow_speed = 30      // 慢速收敛:30帧完成
}

这里有个坑——不是越快越好。我曾经在一个项目中把收敛速度调到3帧,结果用户从室内走到室外,画面像抽风一样忽明忽暗,体验极差。

我的经验:

预览模式下,收敛速度建议设在8-15帧。太快了画面闪烁,太慢了用户等不及。拍照模式可以适当放慢到20-30帧,追求更稳定的曝光。

3.3 目标亮度调节:你到底想要多亮?

目标亮度(Target Luminance)是AE的"靶心"。高通平台用target_luma来表示,单位是Y值(0-255)。

默认值通常是110-120,但实际项目中很少直接用默认值。为什么?因为不同场景对亮度的要求完全不同:

场景 推荐目标亮度 说明
普通白天 110-120 标准亮度,细节保留好
夜景 80-100 压低亮度,减少噪点
人像 130-140 提亮肤色,显得通透
逆光 100-110 平衡高光和阴影

你想想看,如果夜景也用120的目标亮度,那画面噪点会多到没法看。所以目标亮度必须跟场景绑定。

注意:

目标亮度不是越高越好。我见过有人把目标亮度调到160,结果人脸惨白,高光全爆。记住:亮≠好,平衡才是王道。

3.4 AE权重表(Metering):让相机"看"对地方

权重表,说白了就是告诉相机:画面里哪些区域更重要。高通平台把画面分成若干个格子,每个格子分配一个权重值。

默认的权重表是平均测光——所有格子权重一样。但实际场景中,我们往往需要让相机"偏袒"某些区域。

举个例子,人脸测光:

// 高通平台人脸测光权重表示例(5x5网格)
ae_metering_weight = {
    {1, 1, 2, 1, 1},
    {1, 3, 5, 3, 1},
    {2, 5, 8, 5, 2},
    {1, 3, 5, 3, 1},
    {1, 1, 2, 1, 1}
}

这个权重表把中心区域的权重设到8,边缘只有1。这样AE会优先保证中心区域的曝光准确。

我在项目中遇到过一个问题:某款手机拍文档时,中心区域总是过曝。排查了半天,发现是权重表太"偏心"了——中心权重太高,导致AE为了压暗中心,把整体曝光拉低,结果边缘全黑了。

避坑指南:

我曾经在调试一款折叠屏手机时,发现展开和折叠状态下,权重表需要完全不同的配置。展开时屏幕大,用户更关注中心;折叠时屏幕小,用户更关注整体。所以权重表一定要跟屏幕尺寸和用户习惯挂钩。

3.5 实战:配置一个合理的AE策略

好了,理论讲完了,咱们来点实际的。下面是我在一个项目中用过的AE配置方案:

// 实战AE配置(高通平台)
ae_config = {
    // 收敛速度
    .convergence_speed = {
        .preview = 10,      // 预览模式:10帧收敛
        .capture = 25,      // 拍照模式:25帧收敛
        .video = 15         // 录像模式:15帧收敛
    },
    
    // 目标亮度
    .target_luma = {
        .normal = 115,      // 普通场景
        .night = 90,        // 夜景
        .portrait = 135,    // 人像
        .backlight = 105    // 逆光
    },
    
    // 权重表(中心加权)
    .metering_weight = {
        {1, 2, 3, 2, 1},
        {2, 4, 6, 4, 2},
        {3, 6, 9, 6, 3},
        {2, 4, 6, 4, 2},
        {1, 2, 3, 2, 1}
    }
}

这个配置的核心思路是:预览快、拍照稳、场景自适应。预览时快速收敛让用户看到画面变化,拍照时慢速收敛追求最佳曝光,不同场景用不同的目标亮度。

3.6 AE调试的"三板斧"

最后,分享我调试AE时的三个核心步骤:

  1. 先定目标亮度:根据场景确定合适的Y值,这是所有工作的基础
  2. 再调收敛速度:在目标亮度确定后,调整收敛速度到"不闪不慢"
  3. 最后配权重表:根据用户关注区域,设计合理的权重分布

这三步走下来,AE基本不会出大问题。当然,实际项目中会遇到各种奇葩场景——比如强光下的人脸、全黑环境下的夜景、运动中的物体——这些都需要针对性地微调。

嗯,AE的内容今天就到这儿。记住一句话:AE不是调得越亮越好,而是调得越"准"越好。这个"准"字,就是咱们工程师要追求的境界。

AE自动曝光核心流程 场景亮度输入 AE引擎(cam_ae_module) 收敛速度 | 目标亮度 | 权重表 曝光时间 模拟增益 数字增益 最终图像亮度 反馈闭环 核心公式:最终亮度 = 曝光时间 × 模拟增益 × 数字增益 三个参数由AE引擎根据场景亮度、收敛速度、目标亮度和权重表共同决定