4. 自动白平衡(AWB):灰度世界、完美反射、色温估计与AI增强方法

自动白平衡,说白了就是让相机在不同光源下都能把白色拍成白色。你想想看,在暖色灯光下拍的白纸会偏黄,在阴天拍的白纸会偏蓝。人眼会自动校正这种色偏,但传感器不会。所以AWB就是替传感器做这件事。

我刚开始做ISP时,觉得AWB不就是找个白点嘛,能有多难?后来在项目里被各种极端场景折磨过,才明白这玩意儿水很深。今天咱们就把传统方法和AI增强的路子都捋一遍。

4.1 白平衡问题的数学本质

先看一个简单模型。假设传感器捕获的RGB值,是光源光谱、物体反射率和传感器响应三者乘积的积分。白平衡要做的,就是估计光源的颜色,然后把它校正到标准光源(通常是D65)下。

数学上,我们通常用对角模型(Von Kries模型)来近似:

R_corrected = R_raw * (R_gain)
G_corrected = G_raw * (G_gain)
B_corrected = B_raw * (B_gain)

其中增益系数就是我们要算的东西。通常固定G通道增益为1,只调R和B。为什么?因为人眼对绿色最敏感,拿它当基准最稳。

核心思路: AWB的本质就是估计光源色温,然后反推增益系数。估计得越准,校正效果越好。

4.2 传统方法:灰度世界假设

这是最经典的方法,也是我入行时学的第一个AWB算法。它的假设很简单:一幅彩色图像中,所有像素的RGB平均值应该趋于灰色。

换句话说,如果场景里颜色足够丰富,那么R、G、B三个通道的均值应该相等。如果不相等,差值就是光源造成的色偏。

计算步骤:

  1. 计算整幅图像R、G、B通道的均值:R_avg, G_avg, B_avg
  2. 计算增益:R_gain = G_avg / R_avg, B_gain = G_avg / B_avg
  3. 用增益校正每个像素

听起来很完美对吧?但我在项目中踩过坑——这个假设在单一色调场景下会彻底失效。比如拍一片蓝天,整幅图都是蓝色,灰度世界会强行把蓝色拉成灰色,结果天空变成了灰蒙蒙的,完全失真。

避坑指南: 我曾经在一个无人机项目里用灰度世界做AWB,结果无人机飞到农田上空,满屏绿色。算法把绿色硬拉成灰色,整个画面像褪色了一样。后来加了场景检测,发现绿色占比超过阈值就切换算法,才解决问题。

4.3 传统方法:完美反射假设

这个方法换个思路——它假设图像中最亮的像素是白色物体反射光源的结果。所以只要找到最亮的那些像素,用它们的颜色来估计光源就行了。

具体做法:

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

这个方法在室内场景效果不错,因为经常有白色墙壁、白色纸张等。但问题也很明显——如果场景里没有白色物体呢?比如拍一个红色苹果,最亮的部分是苹果的高光,那算法就会把红色当成白色来校正,结果整个画面偏青。

方法 适用场景 失效场景 计算量
灰度世界 色彩丰富的自然场景 单一色调场景(蓝天、草地) 低
完美反射 室内、有白色物体的场景 无白色物体、高光非白色 低
色温估计 已知光源类型的场景 混合光源、非标准光源 中

4.4 色温估计方法

这个方法更物理一些。它利用一个事实:不同色温的光源,在RGB色度图上的分布是有规律的。比如白炽灯(~2800K)偏红黄,日光(~5500K)偏白,阴天(~6500K+)偏蓝。

做法是:

  1. 把图像像素投影到色度空间(比如rg色度图)
  2. 沿着普朗克轨迹(黑体辐射轨迹)搜索最匹配的色温
  3. 根据色温查表得到增益系数

我记得在手机摄像头项目里,我们预置了十几种常见光源的色温-增益映射表。效果比灰度世界稳定,但遇到混合光源(比如室内既有日光又有灯光)就麻烦了,因为色温估计会取一个折中值,导致部分区域偏色。

个人经验: 我建议在实际项目中,不要只用单一方法。可以把灰度世界和完美反射的结果做加权融合,权重根据场景统计信息动态调整。这样鲁棒性会好很多。

4.5 AI增强方法:从分类到回归

传统方法说到底都是基于假设的。假设不成立,结果就崩。AI方法就不一样了——它直接从数据里学映射关系。

最早的做法是色温分类:用CNN把图像分成室内、室外、阴天、日落等场景,然后每个场景用不同的AWB参数。我在2018年做过一个项目,用MobileNet做分类,在低端芯片上也能跑实时。效果比传统方法好,但分类粒度太粗,遇到过渡场景就尴尬。

后来进化到色温回归:直接用网络输出色温值和增益系数。网络结构通常是:

Input: 下采样后的图像 (64x64 或 128x128)
Backbone: 轻量CNN (如ShuffleNet, EfficientNet-Lite)
Head: 全连接层输出 2 个值 (R_gain, B_gain)
Loss: 与ground truth的L2距离 + 感知损失

这里有个关键点——训练数据怎么来? 我见过很多团队用合成数据,但合成数据和真实数据总有差距。我个人的做法是:用多台标定过的相机,在几十种标准光源下拍摄Macbeth色卡,然后人工标注白平衡参数。虽然费时,但效果扎实。

4.6 混合架构:传统+AI的协同

纯AI方法也有问题——泛化性不够。遇到训练集里没见过的光源,网络可能输出离谱的结果。所以现在的主流方案是混合架构。

我参与的一个量产方案是这样的:

  1. 传统方法做粗估计:灰度世界+完美反射,快速算出一个初始增益
  2. AI做细校正:一个小网络(只有几万参数)输入图像块和初始增益,输出增益残差
  3. 后处理:用色温约束和时序平滑,防止增益跳变

这样做的好处是:传统方法保证了基本盘,AI只在需要微调的地方起作用。即使AI偶尔犯错,也不会偏离太远。

关键洞察: 混合架构不是简单的"AI替代传统",而是让AI做AI擅长的事(精细校正),让传统方法做传统方法擅长的事(稳定兜底)。两者互补,才是工程上最靠谱的方案。

4.7 AWB的知识体系

下面这张图把AWB的核心脉络梳理清楚了。从输入图像到最终校正,每一步都有多种选择,而混合架构是目前最实用的路径。

自动白平衡(AWB)知识体系 输入 RAW/Bayer 图像 灰度世界假设 完美反射假设 色温估计法 单一色调失效 无白色物体失效 混合光源失效 AI 增强:分类 / 回归 / 残差校正 混合架构:传统粗估计 + AI 细校正 校正后 RGB 图像 传统方法兜底,AI微调 混合架构是量产首选

4.8 工程落地要点

最后聊几个我在量产项目里总结的要点:

  • 时序平滑很重要:AWB增益不能逐帧跳变,否则视频会闪烁。我习惯用IIR滤波做平滑,时间常数设0.3-0.5秒。
  • 置信度机制:当AI输出的增益与历史值偏差过大时,降低AI的权重,回退到传统方法。这个机制救过我很多次。
  • 肤色保护:AWB校正后,人脸肤色不能偏。我通常在增益计算后加一个肤色区域的约束项,确保人脸颜色在合理范围内。
  • 调试工具:建议在ISP pipeline里预留AWB增益的log接口。我在现场调试时,经常靠分析log里的增益变化曲线来定位问题。

一句话总结: AWB没有银弹。灰度世界简单但脆弱,完美反射依赖场景,色温估计需要先验,AI需要数据。混合架构把它们的优点组合起来,才是工程上最稳健的选择。