4. AWB核心算法——灰度世界法

灰度世界法,说白了就是AWB算法里最经典、最基础的一个假设。我刚开始接触ISP的时候,第一个学的自动白平衡算法就是它。为什么?因为它简单、直观,而且很多场景下效果还不错。

它的核心思想其实就一句话:一张色彩丰富的自然图像,所有像素的R、G、B三个通道的平均值,应该趋于同一个灰度值。你想想看,如果一张图拍出来偏蓝,那蓝色通道的平均值肯定偏高;偏黄,红色和绿色通道的平均值就会偏高。灰度世界法就是抓住这个规律,把偏掉的通道拉回来。

4.1 算法原理

这个假设的物理基础是什么呢?我记得有一次在实验室调一个户外场景的AWB参数,怎么调都偏色。后来我仔细想了想——自然界的物体表面反射率,在统计意义上确实是均匀的。也就是说,你把所有物体的颜色平均一下,结果应该是灰色。

基于这个假设,算法流程其实很直接:

  1. 统计全局均值:计算整张图像R、G、B三个通道的像素平均值,记为 R_avg、G_avg、B_avg。
  2. 计算灰度参考值:通常取三个通道均值的平均值,或者直接取G通道均值作为参考。公式是 Gray = (R_avg + G_avg + B_avg) / 3。
  3. 计算增益系数:每个通道的增益 = Gray / 该通道均值。比如 R_gain = Gray / R_avg。
  4. 校正每个像素:对每个像素的R、G、B值分别乘以对应的增益系数。

关键点:增益系数是全局统一的,整张图用同一组增益。这意味着灰度世界法假设光源在整个画面中是均匀的。

4.2 数学推导

咱们来走一遍数学推导,其实不复杂。设输入图像为 I(x, y),校正后的图像为 I'(x, y)。

第一步,计算各通道均值:

R_avg = (1/N) * Σ Σ R(x, y)
G_avg = (1/N) * Σ Σ G(x, y)
B_avg = (1/N) * Σ Σ B(x, y)

其中 N 是图像总像素数。

第二步,定义灰度参考值。这里有两种常见做法:

方法 公式 特点
三通道平均法 Gray = (R_avg + G_avg + B_avg) / 3 最常用,均衡性好
绿色通道法 Gray = G_avg 利用人眼对绿色最敏感的特性

第三步,计算增益:

R_gain = Gray / R_avg
G_gain = Gray / G_avg
B_gain = Gray / B_avg

第四步,校正:

R'(x, y) = R(x, y) * R_gain
G'(x, y) = G(x, y) * G_gain
B'(x, y) = B(x, y) * B_gain

嗯,这里要注意。校正后的像素值可能会超过255(8位图像),所以最后还需要做一次裁剪或归一化。我一般习惯先做增益,再统一做一次全局色调映射,这样能避免高光区域过曝。

4.3 优缺点分析

灰度世界法用了这么多年,肯定有它的长处,但也有明显的短板。我列个表,大家看得清楚些。

维度 优点 缺点
实现复杂度 极低,几行代码就能跑起来 —
计算速度 快,只需一次全局扫描 —
适用场景 色彩丰富的自然场景 单一主色调场景(如蓝天、草地)会失效
鲁棒性 对噪声不敏感 对大块纯色物体敏感,容易误判
光源假设 — 假设光源均匀,实际场景常不满足

我个人的经验是:灰度世界法在户外自然光、多色彩场景下表现很好。但如果你拍的是大片草地或者蓝色天空,那结果就惨不忍睹了。我曾经在一个无人机航拍项目里用过它,飞过一片森林时画面全绿,算法直接把红色通道增益拉到最大,结果天空变成了紫色……

避坑指南:我曾经在一个监控摄像头项目里,直接用灰度世界法处理夜间场景。结果因为画面大部分是黑色,三个通道均值都接近0,增益计算直接爆炸。后来我加了一个暗场保护逻辑——当通道均值低于某个阈值时,不参与增益计算。

4.4 适用场景

灰度世界法不是万能的,但用对地方效果很好。我总结了几类典型场景:

  • 自然风光摄影:有蓝天、绿树、红花、白云,色彩丰富,灰度假设成立。
  • 室内多光源场景:如果室内有多个不同色温的光源,灰度世界法能给出一个折中的白平衡。
  • 视频预览:因为计算快,适合做实时预览的初步白平衡,后续再用更复杂的算法精调。
  • 嵌入式设备:算力有限时,灰度世界法是性价比最高的选择。

不适合的场景也很明显:

  • 单一主色调场景:比如拍一片沙漠、一片海洋。
  • 人工光源强烈的场景:比如舞台灯光,画面颜色分布极不均匀。
  • 暗光环境:噪声会干扰均值统计,导致增益不稳定。

4.5 灰度世界法知识结构

下面这张图把灰度世界法的核心逻辑串起来了,从假设到实现,再到优缺点,一目了然。

灰度世界法核心知识结构 核心假设:色彩丰富的图像 → 平均灰度 算法流程:统计均值 → 计算灰度参考 → 求增益 → 校正 数学推导 R_avg = ΣR/N, G_avg = ΣG/N, B_avg = ΣB/N Gray = (R_avg + G_avg + B_avg) / 3, 增益 = Gray / 通道均值 优点 实现简单、计算快速 对噪声不敏感、适合实时系统 缺点 单一主色调场景失效 大块纯色物体易误判 适用场景:自然风光、多光源室内、视频预览、嵌入式设备 注意:假设光源均匀 实际场景常不满足

4.6 实战中的改进思路

纯灰度世界法在实际工程中很少直接使用。我一般会做几个小改进:

  • 加权重:给图像中心区域更高的权重,因为主体通常在中部。
  • 剔除异常像素:去掉过亮(接近255)和过暗(接近0)的像素,避免极端值干扰均值。
  • 与其它算法融合:比如先做灰度世界法做粗调,再用完美反射法做精调。

小技巧:我习惯在调试时把三个通道的增益值打印出来。如果某个通道增益超过2.0或者低于0.5,基本可以判断当前场景不适合灰度世界法,需要切换到其它算法。

灰度世界法虽然简单,但它是理解AWB算法的基础。你把这个搞透了,后面学更复杂的算法就会轻松很多。