1. AWB 基础概念:色温与光源、人眼视觉恒常性、AWB 在 ISP Pipeline 中的位置

各位好,欢迎来到《AWB 白平衡与色彩还原调优指南》的第一章。

做图像处理这些年,我见过太多工程师一上来就调 AWB 的增益矩阵,结果越调越偏。说白了,AWB 不是靠蛮力调参数就能搞定的。你得先理解三个最基础的东西:色温是什么、人眼为什么能“自动白平衡”、以及 AWB 在整个 ISP 流程里到底站在哪个位置。

这一章,我们就先把这三块地基打牢。

1.1 色温与光源:为什么光有“颜色”?

先问一个问题:一张白纸,在正午阳光下看是白的,在烛光下看呢?

你可能会说“偏黄”。没错。但为什么相机拍出来有时偏蓝、有时偏红?这就要从色温说起。

色温(Color Temperature),单位是开尔文(K)。它描述的是光源发出的光谱成分。一个理想黑体被加热到不同温度时,会发出不同颜色的光——温度越低,光越偏红;温度越高,光越偏蓝。

光源场景 典型色温(K) 视觉感受
烛光 / 日出日落 1800 – 2800 暖黄 / 橙红
白炽灯 2700 – 3300 暖白
荧光灯(暖白) 3500 – 4500 中性偏暖
正午日光 / 闪光灯 5000 – 6500 标准白光
阴天 / 阴影 6500 – 8000 冷白 / 偏蓝
蓝天(无直射光) 10000 – 15000 深蓝

我在项目中遇到过一件事:一个户外监控摄像头,白天画面正常,一到黄昏就偏红。查了半天,发现是 AWB 的色温范围只设到了 4000K–7000K,根本没覆盖 2500K 的烛光场景。嗯,这就是典型的不理解光源范围导致的坑。

小提示: 色温不是“温度”,而是“颜色特征”。记住一个口诀:低色温暖(红/黄),高色温冷(蓝)。别搞反了。

1.2 人眼视觉恒常性:为什么我们觉得白纸一直是白的?

你想想看,人眼其实没有“色温传感器”。但我们无论在烛光下还是日光下,看一张白纸都觉得它是白的。这就是色彩恒常性(Color Constancy)。

人脑会做一件很厉害的事:它根据场景中的“参考白”来调整感知。比如在烛光下,人脑知道光源偏黄,于是自动把黄色分量“减掉”,让你觉得物体颜色没变。

但相机没有这个本能。CMOS 传感器看到什么就是什么——烛光下拍白纸,它就是黄的。所以我们需要 AWB 来模拟人眼的这个能力。

核心理解: AWB 的本质,就是让相机学会“人眼的欺骗术”。它通过算法估计当前光源的色温,然后对 R、G、B 三个通道施加不同的增益,把“偏色”拉回来。

我曾经调试一个手机摄像头,在商场混合光源(暖色射灯 + 冷色日光灯)下,AWB 来回跳。为什么?因为算法只假设了单一光源,而人眼在混合光下其实会取一个“平均感知”。后来我加了多光源估计模块,才稳住。这个后面章节会细讲。

1.3 AWB 在 ISP Pipeline 中的位置

ISP(Image Signal Processor)是一条流水线。AWB 不是第一个模块,也不是最后一个。它卡在一个非常关键的位置。

下面这张图是我自己整理的典型 ISP 流程,你可以看到 AWB 的上下游关系:

AWB 在 ISP Pipeline 中的位置 典型 ISP Pipeline 与 AWB 位置 RAW 输入 黑电平校正 去噪 AWB 增益 去马赛克 色彩校正 Gamma 校正 色彩增强 YUV / JPEG 输出 关键说明: AWB 增益模块在去马赛克之前执行,此时数据仍是 RAW 格式(Bayer 模式)。 这意味着 AWB 是对每个像素的 R/G/B 原始值做乘法增益,不涉及插值或邻域计算。 ⚠️ 常见误区:有人把 AWB 放在去马赛克之后做。这会导致色彩混叠,因为插值后的 R/G/B 已经包含了邻域信息,再调增益会引入伪色。记住:AWB 必须在 RAW 域完成。

从图上你能看到,AWB 增益模块位于去噪之后、去马赛克之前。为什么是这个位置?

  • 在去噪之后:因为噪声会影响色温估计的准确性。先降噪,AWB 才能拿到干净的统计信息。
  • 在去马赛克之前:因为 AWB 是对 RAW 域的 R/G/B 通道分别施加增益。如果先插值成 RGB 全彩图,每个像素的 R/G/B 值已经混合了邻域信息,再调增益就会产生颜色失真。
避坑指南: 我曾经在一个 FPGA 项目上,为了节省一行 line buffer,把 AWB 移到了去马赛克之后。结果画面边缘出现彩虹条纹,折腾了两天才发现是增益作用在了插值数据上。从此我牢记:AWB 永远在 RAW 域做。

1.4 AWB 的输入与输出

搞清楚了位置,我们再看看 AWB 模块具体吃什么、吐什么。

项目 说明
输入 RAW 图像数据(Bayer 格式),以及统计信息(如 R/G/B 通道的均值、直方图)
处理 1. 统计场景中的颜色分布
2. 估计当前光源色温
3. 计算 R、G、B 三通道的增益系数
输出 增益后的 RAW 数据(R_gain * R, G_gain * G, B_gain * B)

一个简单的 AWB 增益计算示例(伪代码):

// 假设统计得到场景中 R/G/B 的均值
float R_avg = 120.0;
float G_avg = 150.0;
float B_avg = 180.0;

// 目标:让 R、G、B 的均值相等(灰色世界假设)
float R_gain = G_avg / R_avg;  // = 1.25
float G_gain = 1.0;            // 通常以 G 为参考
float B_gain = G_avg / B_avg;  // = 0.833

// 对每个像素施加增益
for each pixel in RAW:
    pixel.R = pixel.R * R_gain;
    pixel.G = pixel.G * G_gain;
    pixel.B = pixel.B * B_gain;
注意: 上面的“灰色世界假设”只是最基础的 AWB 算法。实际工程中,你会遇到各种复杂场景——大面积单色物体、混合光源、低照度等。这些我们会在后续章节逐一拆解。

1.5 本章小结

这一章我们聊了三件事:

  • 色温:低色温暖、高色温冷,不同光源对应不同色温范围。
  • 人眼视觉恒常性:人脑会自动补偿光源颜色,相机需要 AWB 来模拟这个能力。
  • AWB 在 ISP 中的位置:在去噪之后、去马赛克之前,且必须在 RAW 域操作。

我个人习惯是,每接触一个新的 ISP 平台,第一件事就是画出它的 Pipeline 图,标出 AWB 的上下游。这能帮你快速定位问题——偏色了,是 AWB 本身的问题,还是上游噪声没处理好,或是下游色彩校正矩阵配错了。

嗯,地基打好了,后面我们才能盖高楼。