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%-5% 的像素
- 计算这些像素的 R、G、B 均值
- 用均值比例计算增益
完美反射比灰度世界更鲁棒一些,但也不是万能的。如果场景里本身就没有白色物体,比如拍一片红色晚霞,算法就会把最亮的红色区域当成白色,结果整个画面偏青。
我个人习惯把两种算法结合起来用。先跑灰度世界,再跑完美反射,然后根据场景置信度做加权融合。效果比单一算法好不少。
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 调优流程:
- 标定阶段:用标准光源箱拍摄 DNP 色卡,记录各色温下的 R/G、B/G 参考值
- 算法选型:根据场景选择主算法和备选算法
- 参数初始化:设置增益限幅、色温范围、收敛速度等参数
- 主观评测:在 10+ 种典型场景下拍摄,观察偏色情况
- 客观指标:用色卡计算 ΔE 色差,目标 ΔE < 3
- 迭代调优:根据评测结果调整参数,重复步骤 4-5
关键指标:ΔE 色差是衡量 AWB 效果的核心指标。ΔE < 2 表示人眼几乎看不出偏色;ΔE 在 2-5 之间,轻微偏色可接受;ΔE > 5 就需要重新调参了。
下面这张图展示了 AWB 调优的核心流程和参数关系:
3.5 常见偏色问题与解决方案
调 AWB 久了,你会发现偏色问题就那么几种。我整理了一个对照表:
| 偏色现象 | 可能原因 | 解决方案 |
|---|---|---|
| 整体偏黄/橙 | 低色温场景下 B 增益不足 | 提高 B 增益上限,或扩大色温范围下限 |
| 整体偏蓝 | 高色温场景下 R 增益不足 | 提高 R 增益上限,或扩大色温范围上限 |
| 绿色场景偏洋红 | 灰度世界算法误判 | 切换为色温估计算法,或增加场景检测 |
| 红色场景偏青 | 完美反射算法误判 | 降低完美反射权重,或增加白色像素筛选阈值 |
| 画面闪烁偏色 | AWB 收敛速度过快 | 增加帧间平滑系数,降低收敛速度 |
| 暗部偏色严重 | 低信噪比下增益放大噪声 | 增加暗部保护机制,降低暗区增益 |
我的调试习惯:每次只改一个参数,改完拍 20 张不同场景的图。不要同时调增益限幅和色温范围,否则出了问题你根本不知道是哪个参数导致的。调参是个细活,急不得。
嗯,AWB 这块内容确实不少。色温基础、三大算法、关键参数、调优流程,每个点都能单独讲一节课。但核心就一句话:理解色温,选对算法,卡好限幅,分场景调优。把这四点做到位,偏色问题能解决 80%。