第二章:AWB核心算法原理

做AWB调试这些年,我接触过不少算法。说白了,白平衡算法就是帮相机回答一个问题:“眼前这片白色,到底是什么光源下的白色?”

今天我把四种最核心的算法掰开揉碎讲给你听。嗯,这四种方法各有脾气,咱们一个一个来。

2.1 灰度世界法(Gray World)

这是最经典的算法,也是我入行时学的第一个AWB算法。它的假设很简单:一张色彩丰富的照片,所有像素的R、G、B平均值应该相等

你想想看,如果一张图偏蓝,那蓝色通道的平均值肯定比红色和绿色高。算法要做的就是把三个通道拉平。

核心公式:

R_gain = G_avg / R_avg
B_gain = G_avg / B_avg

其中 R_avg、G_avg、B_avg 分别是三个通道的像素平均值。

我在项目中遇到过一个问题:拍大面积的蓝色天空时,灰度世界法会把天空强行拉成灰色。为什么?因为场景里蓝色太多,算法以为整张图偏蓝了。

避坑指南:我曾经在一个户外监控项目里吃过这个亏。场景里全是绿树和蓝天,灰度世界法把绿色通道压得太狠,结果人脸都发紫了。后来我加了饱和度检测,只对低饱和度区域做统计,才把问题解决。

适用场景:色彩丰富的室内场景、多物体混合场景。

不适用场景:大面积单色场景(蓝天、草地、红墙)。

2.2 完美反射法(Perfect Reflector)

这个方法的名字很形象——它假设场景里存在一块“完美白色”的反射面。说白了,就是找图像里最亮的那些像素,认为它们应该是白色的。

具体怎么做?

  1. 把图像转成YCbCr或类似亮度色度空间
  2. 找出亮度最高的前1%~5%的像素
  3. 用这些像素的R、G、B平均值来计算增益

我的经验:完美反射法对高光区域特别敏感。我调试手机摄像头时发现,如果场景里有镜面反光(比如玻璃、水面),算法会误以为这些高光就是白色参考点。结果整张图偏冷偏蓝。

解决办法?加一个高光检测,排除掉那些亮度超过240(8bit)的像素。嗯,这招挺管用。

优点:对暗部噪声不敏感,适合低光照场景。

缺点:如果场景里根本没有白色物体,算法就“瞎了”。

2.3 色温估计法(Color Temperature Estimation)

这个方法更聪明一些。它不直接猜颜色,而是先估计当前场景的色温,再根据色温查表得到增益值。

流程是这样的:

输入图像 → 统计R/G、B/G比值 → 映射到色温曲线 → 查表得到增益

色温曲线怎么来的?说白了就是提前标定好的。我们在实验室里用D65(6500K)、D50(5000K)、A光源(2856K)等标准光源拍灰卡,记录下不同色温下的R/G和B/G比值,连成一条曲线。

色温-比值对应关系(示例数据):

色温(K) R/G B/G
2800(白炽灯) 1.85 0.65
4000(荧光灯) 1.40 0.90
5500(日光) 1.10 1.10
6500(阴天) 0.95 1.30

我个人习惯用色温估计法做“粗调”,再用灰度世界法做“细调”。为什么?因为色温估计法稳定,但精度有限;灰度世界法精度高,但容易跑偏。两者结合,效果最好。

注意:我曾经遇到一个案例——混合光源场景(一半日光一半荧光灯)。色温估计法直接懵了,因为整张图的色温分布不均匀。后来我加了分块统计,把图像分成16x16块,每块单独估计色温,再根据置信度做融合。这才把问题搞定。

2.4 色域映射法(Gamut Mapping)

这个方法比较新,也是我现在最常用的。它的思路是:在标准光源下,所有“真实白色”的R/G和B/G比值应该落在一个固定的区域内。这个区域就叫“色域”。

算法流程:

  1. 把图像中每个像素的R/G和B/G比值画在二维坐标系里
  2. 找出那些落在“白色色域”内的像素
  3. 用这些像素计算增益

我的经验:色域映射法的关键是“白色色域”的标定。我一般会采集20~30种不同光源下的灰卡数据,画出一个多边形区域。这个区域越大,算法越鲁棒,但精度会下降;区域越小,精度高,但容易漏掉真实白色。

说白了,这是个取舍问题。我通常取一个中间值——覆盖90%的常见光源,留10%的余量给极端场景。

优点:对彩色物体不敏感,不会把红色误判为偏色。

缺点:标定工作量大,需要采集大量数据。

2.5 四种算法对比总结

算法 原理 优点 缺点 我推荐的使用场景
灰度世界法 三通道均值相等 简单、计算快 大色块场景失效 室内、多色彩场景
完美反射法 最亮像素为白色 暗光表现好 依赖高光区域 夜景、低光照
色温估计法 根据色温查表 稳定、可预测 混合光源不准 单一光源场景
色域映射法 白色像素落在色域内 抗干扰强 标定工作量大 高端相机、专业设备

2.6 知识体系结构图

下面这张图是我自己画的,把四种算法的关系和适用场景串起来了。你看一眼就能明白它们各自的位置。

AWB核心算法知识体系 AWB白平衡算法 灰度世界法 三通道均值相等 完美反射法 最亮像素为白色 色温估计法 根据色温查表 色域映射法 白色落在色域内 适用场景推荐 室内多色彩 → 灰度世界 夜景低光 → 完美反射 单一光源 → 色温估计 专业设备 → 色域映射 实际项目中,我通常组合使用2~3种算法,取长补短 混合使用效果更佳

看到这张图你应该明白了——没有一种算法是万能的。我做了这么多年调试,最大的体会就是:要根据场景选算法,甚至要动态切换

我的实战建议:如果你刚开始做AWB调试,先从灰度世界法入手。它简单、直观,能帮你快速理解白平衡的本质。等遇到搞不定的场景了,再引入色温估计法做辅助。色域映射法虽然效果好,但标定成本高,适合产品定型阶段再优化。

好了,这四种算法就讲到这里。下一章我会讲怎么在实际项目中把这些算法落地——包括参数调优、场景分类、以及我最头疼的“混合光源”问题怎么解决。


专注资料整理