第二章: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)
这个方法的名字很形象——它假设场景里存在一块“完美白色”的反射面。说白了,就是找图像里最亮的那些像素,认为它们应该是白色的。
具体怎么做?
- 把图像转成YCbCr或类似亮度色度空间
- 找出亮度最高的前1%~5%的像素
- 用这些像素的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比值应该落在一个固定的区域内。这个区域就叫“色域”。
算法流程:
- 把图像中每个像素的R/G和B/G比值画在二维坐标系里
- 找出那些落在“白色色域”内的像素
- 用这些像素计算增益
我的经验:色域映射法的关键是“白色色域”的标定。我一般会采集20~30种不同光源下的灰卡数据,画出一个多边形区域。这个区域越大,算法越鲁棒,但精度会下降;区域越小,精度高,但容易漏掉真实白色。
说白了,这是个取舍问题。我通常取一个中间值——覆盖90%的常见光源,留10%的余量给极端场景。
优点:对彩色物体不敏感,不会把红色误判为偏色。
缺点:标定工作量大,需要采集大量数据。
2.5 四种算法对比总结
| 算法 | 原理 | 优点 | 缺点 | 我推荐的使用场景 |
|---|---|---|---|---|
| 灰度世界法 | 三通道均值相等 | 简单、计算快 | 大色块场景失效 | 室内、多色彩场景 |
| 完美反射法 | 最亮像素为白色 | 暗光表现好 | 依赖高光区域 | 夜景、低光照 |
| 色温估计法 | 根据色温查表 | 稳定、可预测 | 混合光源不准 | 单一光源场景 |
| 色域映射法 | 白色像素落在色域内 | 抗干扰强 | 标定工作量大 | 高端相机、专业设备 |
2.6 知识体系结构图
下面这张图是我自己画的,把四种算法的关系和适用场景串起来了。你看一眼就能明白它们各自的位置。
看到这张图你应该明白了——没有一种算法是万能的。我做了这么多年调试,最大的体会就是:要根据场景选算法,甚至要动态切换。
我的实战建议:如果你刚开始做AWB调试,先从灰度世界法入手。它简单、直观,能帮你快速理解白平衡的本质。等遇到搞不定的场景了,再引入色温估计法做辅助。色域映射法虽然效果好,但标定成本高,适合产品定型阶段再优化。
好了,这四种算法就讲到这里。下一章我会讲怎么在实际项目中把这些算法落地——包括参数调优、场景分类、以及我最头疼的“混合光源”问题怎么解决。