3、自动白平衡(AWB)原理与调优:色温与色度学基础、AWB算法(灰度世界、完美反射、色温估计)、AWB参数(增益限幅、色温范围)对偏色的影响

自动白平衡,说白了就是让相机在各种光线下都能把白色拍成白色。你想想看,一张白纸在日光灯下发蓝,在白炽灯下发黄,人眼会自动校正,但传感器不会。AWB 就是替人眼做这个校正的活儿。

我刚开始调 AWB 时,总觉得这玩意儿玄学成分大。后来踩的坑多了,才发现它背后全是扎实的色度学原理。今天咱们就把这块硬骨头啃下来。

3.1 色温与色度学基础

色温不是温度,是光色的度量。单位是开尔文(K)。数值越低,光越偏红黄;数值越高,光越偏蓝。

光源类型 典型色温(K) 视觉感受
烛光 1800-2000 暖黄
白炽灯 2700-3200 暖白
日光灯 4000-5000 中性白
正午日光 5500-6500 标准白
阴天 6500-8000 冷白偏蓝
蓝天阴影 8000-12000 偏蓝

色度学里有个关键概念——色度坐标。常用的是 CIE 1931 xy 色度图。所有真实颜色都能在这个马蹄形图里找到位置。黑体辐射的轨迹叫普朗克轨迹,色温就是沿着这条线定义的。

我习惯把色温理解成「光的性格」。低温光像老式灯泡,温暖慵懒;高温光像正午太阳,冷峻锐利。调 AWB 时,你得先知道当前场景的「性格」是什么。

核心要点:色温决定了 R/G/B 通道的增益比例。低色温场景下,B 通道增益要远大于 R 通道;高色温场景则相反。这个比例关系是 AWB 算法的数学基础。

3.2 AWB 三大经典算法

市面上 AWB 算法五花八门,但万变不离其宗。最核心的就三种:灰度世界、完美反射、色温估计。我一个个说。

3.2.1 灰度世界算法

这个算法的假设很简单:一张色彩丰富的图片,所有像素的 R、G、B 均值应该相等。如果不等,说明有色偏,需要校正。

数学表达就是:

R_avg = G_avg = B_avg

增益计算:
gain_R = G_avg / R_avg
gain_B = G_avg / B_avg
gain_G = 1.0

听起来很完美对吧?但实际用起来问题不少。我在项目中遇到过一片绿色草原的场景,灰度世界算法直接把整张图拉成了灰色——因为绿色占主导,算法误判为偏绿,强行补偿成洋红。

避坑指南:灰度世界算法对大面积单色场景极度敏感。我曾经在调试户外监控摄像头时,画面里全是蓝天,结果 AWB 把蓝天拉成了黄色。后来加了场景检测,发现大面积单色时自动切换到其他算法。

3.2.2 完美反射算法

这个算法假设:图像中最亮的像素应该是白色。找到这些「疑似白色」的像素,用它们的 R/G/B 比例来计算增益。

实现步骤:

  1. 统计所有像素的亮度值
  2. 取亮度最高的前 1%-5% 的像素
  3. 计算这些像素的 R、G、B 均值
  4. 用均值比例计算增益

完美反射比灰度世界更鲁棒一些,但也不是万能的。如果场景里本身就没有白色物体,比如拍一片红色晚霞,算法就会把最亮的红色区域当成白色,结果整个画面偏青。

我个人习惯把两种算法结合起来用。先跑灰度世界,再跑完美反射,然后根据场景置信度做加权融合。效果比单一算法好不少。

3.2.3 色温估计算法

这是目前主流 ISP 用的方法。核心思路是:先估计当前场景的色温,再查表得到对应的 R/G、B/G 增益。

色温估计通常基于色度空间统计。把图像从 RGB 转到 YCbCr 或 Lab 空间,在色度平面上做聚类分析。找到色度分布的中心点,再映射到色温曲线上。

// 伪代码示例
function estimateColorTemperature(image):
    // 1. 转换到 YCbCr
    ycbcr = rgb2ycbcr(image)
    
    // 2. 统计 Cb、Cr 均值
    cb_avg = mean(ycbcr.Cb)
    cr_avg = mean(ycbcr.Cr)
    
    // 3. 映射到色温曲线
    ct = lookupColorTemperature(cb_avg, cr_avg)
    
    // 4. 查表得到增益
    gain_r = lookupGainR(ct)
    gain_b = lookupGainB(ct)
    
    return gain_r, gain_b

色温估计算法的精度取决于标定数据。我见过一些方案用 20 个标准光源做标定,效果已经不错。但高端方案会用 50-100 个光源,覆盖更细的色温区间。

经验之谈:色温估计算法的标定数据质量直接决定最终效果。我建议至少用 DNP 色卡和 X-Rite 色卡各做一次标定,交叉验证。单靠一种色卡容易过拟合。

3.3 AWB 参数对偏色的影响

算法选好了,参数调不对照样偏色。我重点说两个最关键的参数:增益限幅和色温范围。

3.3.1 增益限幅

增益限幅就是给 R、G、B 通道的增益设置上下限。为什么要限幅?因为极端场景下算法会算出离谱的增益值。

举个例子:在纯红色场景下,灰度世界算法算出的 G/R 增益可能高达 5.0。如果直接应用,B 通道会被拉到极高,产生严重噪声和色偏。

参数 典型范围 偏大影响 偏小影响
R 增益上限 1.5 - 3.0 低色温场景偏红 高色温场景偏蓝
B 增益上限 1.5 - 3.0 高色温场景偏蓝 低色温场景偏黄
G 增益范围 0.8 - 1.2 亮度波动大 校正力度不足

我一般把 R 和 B 的增益上限设在 2.5 左右。太保守的话,极端色温下校正不到位;太激进的话,噪声和偏色风险都高。

我曾经踩过的坑:有一款手机摄像头,在室内白炽灯下总是偏黄。我以为是算法问题,调了三天没效果。后来发现是 B 增益上限设成了 1.8,根本不够补偿低色温场景。改到 2.8 后问题解决。所以调参前先确认限幅没卡死。

3.3.2 色温范围

色温范围决定了 AWB 算法在哪些色温区间内工作。超出范围的场景,要么不校正,要么用边界值。

典型设置:

  • 室内模式:2500K - 4500K
  • 室外模式:4500K - 7500K
  • 全自动模式:2000K - 10000K

范围设得宽,覆盖场景多,但极端色温下容易偏色。范围设得窄,稳定性好,但某些场景会校正不到位。

我建议分场景配置色温范围。比如安防摄像头主要拍室外,就把范围设在 4000K-8000K。手机摄像头要兼顾室内外,用 2500K-7500K 比较稳妥。

3.4 AWB 调优实战流程

说了这么多理论,来点实际的。我总结了一套 AWB 调优流程:

  1. 标定阶段:用标准光源箱拍摄 DNP 色卡,记录各色温下的 R/G、B/G 参考值
  2. 算法选型:根据场景选择主算法和备选算法
  3. 参数初始化:设置增益限幅、色温范围、收敛速度等参数
  4. 主观评测:在 10+ 种典型场景下拍摄,观察偏色情况
  5. 客观指标:用色卡计算 ΔE 色差,目标 ΔE < 3
  6. 迭代调优:根据评测结果调整参数,重复步骤 4-5

关键指标:ΔE 色差是衡量 AWB 效果的核心指标。ΔE < 2 表示人眼几乎看不出偏色;ΔE 在 2-5 之间,轻微偏色可接受;ΔE > 5 就需要重新调参了。

下面这张图展示了 AWB 调优的核心流程和参数关系:

AWB 调优核心流程与参数关系 原始 RAW 数据 色温估计 统计 Cb/Cr 均值 → 映射色温曲线 算法选择 灰度世界 / 完美反射 / 色温估计 增益计算 R/G/B 通道增益 + 限幅 校正后图像 关键参数反馈 • 增益限幅:R/B 上限 1.5-3.0 • 色温范围:2000K-10000K • 收敛速度:帧间平滑系数 调优要点 1. 色温估计精度决定算法上限,标定数据至少覆盖 10 个标准光源 2. 增益限幅是安,但太保守会限制校正能力,需根据传感器噪声水平平衡

3.5 常见偏色问题与解决方案

调 AWB 久了,你会发现偏色问题就那么几种。我整理了一个对照表:

偏色现象 可能原因 解决方案
整体偏黄/橙 低色温场景下 B 增益不足 提高 B 增益上限,或扩大色温范围下限
整体偏蓝 高色温场景下 R 增益不足 提高 R 增益上限,或扩大色温范围上限
绿色场景偏洋红 灰度世界算法误判 切换为色温估计算法,或增加场景检测
红色场景偏青 完美反射算法误判 降低完美反射权重,或增加白色像素筛选阈值
画面闪烁偏色 AWB 收敛速度过快 增加帧间平滑系数,降低收敛速度
暗部偏色严重 低信噪比下增益放大噪声 增加暗部保护机制,降低暗区增益

我的调试习惯:每次只改一个参数,改完拍 20 张不同场景的图。不要同时调增益限幅和色温范围,否则出了问题你根本不知道是哪个参数导致的。调参是个细活,急不得。

嗯,AWB 这块内容确实不少。色温基础、三大算法、关键参数、调优流程,每个点都能单独讲一节课。但核心就一句话:理解色温,选对算法,卡好限幅,分场景调优。把这四点做到位,偏色问题能解决 80%。