2. 传统AE算法回顾:基于统计的AE算法、基于直方图的AE算法、优缺点分析

聊自动曝光算法,咱们得先看看老前辈们是怎么做的。说实话,现在很多号称“智能”的AE算法,底子还是从传统方法里长出来的。我个人习惯是,不管学什么新东西,先把经典套路吃透,这样遇到坑才知道怎么绕。

传统AE算法主要分两派:基于统计的和基于直方图的。这两派思路完全不同,但目标都一样——让画面亮度看着舒服。

2.1 基于统计的AE算法

这派算法的核心思想很简单:把图像分成若干块,每块算一个平均亮度,然后加权求和得到一个“全局亮度指标”。再拿这个指标跟目标亮度比,差值送进控制器去调曝光参数。

我最早接触AE算法时,用的就是这种。当时在做一个安防摄像头项目,画面里经常有大面积天空或者墙壁,结果曝光老是被带偏。嗯,这里要注意——分块和权重的设计,直接决定了算法的成败。

2.1.1 典型的分块策略

分块方式 说明 典型应用场景
均匀网格 图像等分成 M×N 块,每块权重相同 光照均匀的场景
中心加权 中心区域权重高,边缘权重低 人像、主体居中的场景
人脸检测加权 检测到人脸的区域权重极高 视频通话、自拍
运动区域加权 运动检测到的区域权重提高 监控、运动相机

你想想看,如果拍一张人脸特写,用均匀网格去算,背景占了大部分面积,人脸反而被忽略了。结果就是背景正常,人脸过曝或欠曝。所以中心加权是最基础的改进。

2.1.2 算法流程

基于统计的AE,流程其实很直白:

  1. 采集图像:拿到当前帧的RAW或YUV数据。
  2. 分块统计:按预设的网格划分,计算每块的平均亮度(通常是Y通道均值)。
  3. 加权融合:用权重表把各块亮度加权求和,得到Y_avg。
  4. 误差计算:error = Y_target - Y_avg。
  5. 曝光调整:用PID或查表法,根据error调整曝光时间、增益、光圈。
  6. 循环:回到步骤1,直到error收敛到阈值内。

关键公式:

Y_avg = Σ(w_i × Y_i) / Σ(w_i)

其中:
  w_i = 第 i 块的权重
  Y_i = 第 i 块的平均亮度

我曾经在一个项目中,直接用固定权重表,结果场景一变,曝光就来回震荡。后来加了场景检测,动态切换权重表,才稳下来。说白了,权重表不是一劳永逸的。

2.2 基于直方图的AE算法

这派算法不关心图像的空间分布,只看亮度值的统计分布。它把图像所有像素的亮度值做个直方图,然后根据直方图的形状来决定曝光方向。

我个人觉得,直方图方法在处理高动态范围场景时,比统计法更靠谱。为什么?因为统计法只给一个平均值,信息损失太大了。直方图保留了亮度分布的全貌,能看出画面是偏暗、偏亮,还是两头都占。

2.2.1 直方图特征提取

常用的直方图特征包括:

  • 均值:所有像素亮度的平均值。
  • 中位数:排序后位于50%位置的亮度值,抗噪能力强。
  • 众数:出现频率最高的亮度值,代表画面主色调。
  • 偏度:直方图分布的对称性,正偏表示暗部多,负偏表示亮部多。
  • 峰度:分布的集中程度,峰度越高表示亮度越集中。

我的经验:在逆光场景下,直方图会出现明显的“双峰”特征——一个峰在暗部(前景),一个峰在亮部(背景)。这时候用均值去调曝光,结果往往两头不讨好。我建议用中位数或者加权双峰法,效果会好很多。

2.2.2 基于直方图的曝光调整策略

常见的策略有几种:

策略名称 核心逻辑 优点 缺点
中位数法 调整曝光使直方图中位数接近目标亮度 抗噪、稳定 对极端场景响应慢
峰值法 调整曝光使直方图主峰落在目标亮度附近 响应快 多峰场景容易误判
熵最大化法 调整曝光使直方图信息熵最大 细节保留好 计算量大,收敛慢
直方图匹配法 让当前直方图逼近一个理想直方图 效果可控 需要预设理想模板

我曾经在手机相机项目里试过熵最大化法,效果确实好,细节保留得特别完整。但问题是,每帧都要算直方图熵,手机芯片扛不住,发热严重。后来改成每5帧算一次,中间帧用插值,才把功耗压下来。

2.3 两种算法的优缺点对比

咱们把两种算法摆在一起,做个直接对比。这样你选型的时候心里就有数了。

对比维度 基于统计的AE 基于直方图的AE
计算复杂度 低,只需算分块均值 中高,需要统计全图直方图
内存占用 低,只需存权重表和块均值 中,需要存256或1024个bin
收敛速度 快,反馈直接 中等,取决于策略
稳定性 中等,权重设计不好容易震荡 较高,直方图信息丰富
逆光场景 差,容易被背景带偏 较好,能识别双峰特征
低照度场景 一般,噪声影响大 较好,中位数抗噪
高动态场景 差,信息损失严重 好,保留分布信息
实现难度 低,代码量少 中,需要处理直方图

避坑指南:我曾经在一个项目中,为了追求低功耗选了统计法,结果在逆光场景下曝光完全失控。后来不得不临时加了一个直方图辅助模块,才把问题解决。所以选型时别只看计算量,场景覆盖能力同样重要。

2.4 知识体系结构图

下面这张图把传统AE算法的知识结构梳理了一下,方便你建立整体认知。

传统AE算法知识体系结构图 传统AE算法知识体系 传统AE算法 基于统计的AE 基于直方图的AE 均匀网格 中心加权 人脸加权 中位数法 峰值法 熵最大化 优缺点对比分析 统计法:计算快、易实现 直方图法:信息丰富、稳定 选型需权衡场景与功耗 💡 实际工程中,常将两种方法结合使用 统计法做快速粗调,直方图法做精细微调

2.5 小结与选型建议

说了这么多,到底该选哪种?我的建议是:

  • 资源受限、场景简单(比如低端IPC、玩具相机):用基于统计的AE,中心加权就够了。代码量小,跑得快。
  • 场景复杂、画质要求高(比如手机相机、专业摄像机):用基于直方图的AE,或者两者结合。虽然费点算力,但效果值得。
  • 逆光、夜景等极端场景:别犹豫,上直方图法。统计法在这种场景下基本是瞎蒙。

我的个人习惯:做原型验证时先用统计法,因为改参数快。等场景覆盖测出问题了,再针对性地加直方图模块。这样开发效率最高,不会一开始就被复杂度拖死。