2. 传统AE算法回顾:基于统计的AE算法、基于直方图的AE算法、优缺点分析
聊自动曝光算法,咱们得先看看老前辈们是怎么做的。说实话,现在很多号称“智能”的AE算法,底子还是从传统方法里长出来的。我个人习惯是,不管学什么新东西,先把经典套路吃透,这样遇到坑才知道怎么绕。
传统AE算法主要分两派:基于统计的和基于直方图的。这两派思路完全不同,但目标都一样——让画面亮度看着舒服。
2.1 基于统计的AE算法
这派算法的核心思想很简单:把图像分成若干块,每块算一个平均亮度,然后加权求和得到一个“全局亮度指标”。再拿这个指标跟目标亮度比,差值送进控制器去调曝光参数。
我最早接触AE算法时,用的就是这种。当时在做一个安防摄像头项目,画面里经常有大面积天空或者墙壁,结果曝光老是被带偏。嗯,这里要注意——分块和权重的设计,直接决定了算法的成败。
2.1.1 典型的分块策略
| 分块方式 | 说明 | 典型应用场景 |
|---|---|---|
| 均匀网格 | 图像等分成 M×N 块,每块权重相同 | 光照均匀的场景 |
| 中心加权 | 中心区域权重高,边缘权重低 | 人像、主体居中的场景 |
| 人脸检测加权 | 检测到人脸的区域权重极高 | 视频通话、自拍 |
| 运动区域加权 | 运动检测到的区域权重提高 | 监控、运动相机 |
你想想看,如果拍一张人脸特写,用均匀网格去算,背景占了大部分面积,人脸反而被忽略了。结果就是背景正常,人脸过曝或欠曝。所以中心加权是最基础的改进。
2.1.2 算法流程
基于统计的AE,流程其实很直白:
- 采集图像:拿到当前帧的RAW或YUV数据。
- 分块统计:按预设的网格划分,计算每块的平均亮度(通常是Y通道均值)。
- 加权融合:用权重表把各块亮度加权求和,得到
Y_avg。 - 误差计算:
error = Y_target - Y_avg。 - 曝光调整:用PID或查表法,根据error调整曝光时间、增益、光圈。
- 循环:回到步骤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算法的知识结构梳理了一下,方便你建立整体认知。
2.5 小结与选型建议
说了这么多,到底该选哪种?我的建议是:
- 资源受限、场景简单(比如低端IPC、玩具相机):用基于统计的AE,中心加权就够了。代码量小,跑得快。
- 场景复杂、画质要求高(比如手机相机、专业摄像机):用基于直方图的AE,或者两者结合。虽然费点算力,但效果值得。
- 逆光、夜景等极端场景:别犹豫,上直方图法。统计法在这种场景下基本是瞎蒙。
我的个人习惯:做原型验证时先用统计法,因为改参数快。等场景覆盖测出问题了,再针对性地加直方图模块。这样开发效率最高,不会一开始就被复杂度拖死。