AF/AE/AWB 总览:三大算法的核心任务与相互关系

做摄像头成像,说白了就是解决三个问题:看得清、看得亮、看得真。这三个问题分别对应自动对焦(AF)、自动曝光(AE)和自动白平衡(AWB)。

我刚开始接触 ISP 时,总觉得它们是三个独立的模块——对焦归对焦,曝光归曝光,白平衡归白平衡。直到有一次调试一个暗光场景下的预览流,才发现它们之间的耦合远比想象中复杂。嗯,今天我们就来聊聊这三兄弟到底在干什么,以及为什么它们必须绑在一起干活。

三大算法的核心任务

算法 核心任务 一句话概括
AF(自动对焦) 调整镜头位置,使目标场景在传感器上清晰成像 让画面不模糊
AE(自动曝光) 控制进光量,使图像亮度适中、细节保留 让画面不黑不白
AWB(自动白平衡) 消除光源色温影响,还原物体真实颜色 让画面不偏色

你想想看,这三个目标其实对应着人眼最自然的视觉体验。但摄像头不是人眼,它得靠算法去猜、去算、去调。

AF 的核心逻辑

自动对焦的本质是寻找对比度最大的镜头位置。为什么?因为图像越清晰,相邻像素之间的亮度差异就越大。这个差异值,我们叫它"对焦评价函数值"。

常见的对焦评价函数包括:

  • Tenengrad 梯度:用 Sobel 算子计算图像梯度,梯度越大越清晰
  • Laplacian 能量:计算二阶导数的平方和,对边缘敏感
  • 方差法:统计像素灰度值的方差,方差越大细节越丰富

我在项目中遇到过一个问题:当场景中有大面积纯色区域(比如白墙)时,所有评价函数都会失效。因为根本没有边缘可以检测。这时候 AF 会陷入"来回扫"的死循环——镜头推出去拉回来,就是找不到峰值。

避坑指南: 我曾经在调试一款手机摄像头时,发现 AF 在低光照下反复振荡。后来定位到原因是 AE 把增益拉得太高,导致图像噪声被放大,对焦评价函数把噪声当成了"细节"。解决方案是:AF 在做爬山搜索前,先让 AE 稳定下来。

AE 的核心逻辑

自动曝光的目标很直接:让图像的平均亮度落在目标区间。通常这个目标区间是 18% 灰附近——也就是人眼感知的中等亮度。

AE 控制的三个参数,业内叫"曝光三角":

  • 曝光时间(Shutter):传感器感光的时间长度
  • 模拟增益(Analog Gain):传感器读出信号的放大倍数
  • 数字增益(Digital Gain):ISP 内部的数字放大

这三者的优先级是有讲究的。我个人的习惯是:先调曝光时间,再调模拟增益,最后才动数字增益。为什么?因为曝光时间增加会引入运动模糊,模拟增益会引入噪声,数字增益会放大噪声和量化误差。能不动就不动,动了也要尽量少动。

AE 的典型策略:

  • 目标亮度:Y_target = 100~120(8bit 图像)
  • 曝光时间上限:1/30s(手持拍摄防抖)
  • 模拟增益上限:4x~8x(视传感器噪声水平而定)
  • 数字增益上限:2x(超过后画质明显下降)

AWB 的核心逻辑

自动白平衡要解决的是"色温偏移"问题。不同光源的色温不同:

  • 烛光:约 2000K,偏红
  • 白炽灯:约 3200K,偏橙
  • 日光:约 5500K,中性白
  • 阴天:约 7000K,偏蓝
  • 蓝天阴影:约 10000K,偏紫蓝

AWB 的经典做法是"灰世界假设"——认为场景中所有颜色的平均值应该是灰色。如果图像整体偏红,说明色温偏低,需要增加蓝色通道增益;如果整体偏蓝,说明色温偏高,需要增加红色通道增益。

但灰世界假设有个致命缺陷:如果场景本身就以某种颜色为主(比如一片绿色的草地),AWB 会错误地把绿色"校正"成灰色。这就是为什么很多手机拍草地时颜色发灰——AWB 被"骗"了。

注意: 我曾经遇到一个 case,用户在一个全是红色装饰的餐厅里拍照,AWB 把红色强行拉回中性色,结果人脸变成了青灰色。后来我们加了一个"肤色保护"逻辑:如果检测到肤色区域,AWB 的校正量要打折扣。这个 trick 至今还在很多 ISP 里用。

三大算法的相互关系

为什么它们必须协同工作?我给你画个图就明白了。

AF / AE / AWB 协同关系图 AF 自动对焦 AE 自动曝光 AWB 自动白平衡 AE 亮度影响 AF 对比度 AE 增益影响 AWB 色温估计 AF 清晰度影响 AWB 统计 AWB 增益影响 AF 边缘检测 为什么必须协同? 1. AE 增益过高 → 噪声放大 → AF 误判噪声为细节 → 对焦不准 2. AWB 增益调整 → R/G/B 通道比例变化 → AF 边缘检测偏移 3. AF 镜头移动 → 进光量变化 → AE 需要重新收敛 4. AE 曝光时间变化 → 运动模糊 → AF 评价函数值下降

从这张图你能看到,三个算法之间是双向耦合的。任何一个算法的输出变化,都会影响另外两个的输入。

典型的协同问题场景

我举一个实际项目中的例子。某款手机在室内荧光灯下拍照,出现了以下问题链:

  1. AWB 先动:荧光灯有 100Hz 频闪,AWB 统计到的 R/G 比例在每一帧都在跳变
  2. AE 跟着跳:AWB 的增益变化导致图像整体亮度波动,AE 误以为场景亮度在变化,开始调整曝光时间
  3. AF 被带偏:曝光时间变化导致帧率不稳定,AF 的爬山搜索算法在每一帧拿到的对比度值都不一样,永远找不到峰值

结果就是:画面忽明忽暗、颜色来回漂移、对焦一直在拉风箱。三个算法各自都在努力干活,但合在一起就是灾难。

解决方案:

  • 引入"冻结机制":当某个算法正在收敛时,其他算法暂时锁定参数
  • 设置优先级:通常 AE 优先收敛,然后 AWB,最后 AF
  • 加入"死区":参数变化在死区范围内不触发重新收敛

协同工作的核心原则

我个人总结了三句话:

  • 时序上错峰:不要三个算法同时调整,分时执行
  • 信息上共享:AE 的统计信息可以辅助 AWB 判断光源类型,AF 的对比度信息可以辅助 AE 判断场景复杂度
  • 异常上兜底:任何一个算法检测到异常(比如场景切换、剧烈运动),都应该通知其他算法暂停或重置

你想想看,如果三个算法各干各的,就像三个乐手各弹各的调——再好的技术也出不了好音乐。只有指挥统一、节奏一致,才能奏出和谐的乐章。

实战建议: 我在设计 ISP 架构时,习惯把 AF/AE/AWB 放在同一个"3A 引擎"模块里,共享一个状态机和一组统计信息。这样不仅减少了模块间的通信延迟,还能在硬件层面实现"一帧锁定、三帧收敛"的快速响应。