1. AWB基础概念:色温、黑体辐射与人眼恒常性
做图像处理的人,天天跟颜色打交道。但颜色这东西,说白了不是物理量,是心理量。我刚开始接触ISP时,就被色温这个概念绕晕过——明明同一个物体,在不同光源下拍出来颜色差那么多,人眼却觉得“没变”。这就是AWB要解决的核心问题。
这一章,我们先打好地基。把色温、黑体辐射、人眼恒常性这几个概念吃透,你再看AWB算法,就不会觉得它是个黑盒子了。
1.1 色温的定义——不只是“冷”和“暖”
色温,全称是“相关色温”(Correlated Color Temperature, CCT)。它的物理定义很简单:把一个理想黑体加热到某个温度,它发出的光的颜色,就是那个温度对应的色温。单位是开尔文(K)。
举个例子:
- 烛光:约1800K,偏橙红
- 白炽灯:约2800K,暖黄
- 正午日光:约5500K,标准白
- 阴天天空:约6500K~7500K,偏蓝
- 蓝天阴影:约10000K以上,深蓝
你可能会问:为什么温度越高,颜色反而越蓝?这跟直觉相反啊。嗯,我当初也困惑过。其实是因为黑体辐射的峰值波长随温度升高向短波(蓝光)移动。低温时辐射集中在红外和红光区,高温时蓝光成分增多。记住这个规律就好。
关键点:色温不是“温度”,是“颜色度量”。5500K是标准白光,低于它偏暖(红/黄),高于它偏冷(蓝)。
1.2 黑体辐射轨迹——色温的“标准答案”
黑体辐射轨迹(Planckian Locus),是色度图上一根曲线。它记录了不同温度下黑体辐射的颜色坐标。所有真实光源的色度点,都会落在这条曲线附近。
我习惯用CIE 1931色度图来理解这件事。横轴是x,纵轴是y,中间那条弧线就是黑体轨迹。轨迹上的每个点,对应一个精确的色温值。
为什么AWB要关心这条曲线?因为算法做色温估计时,本质上是在找:当前场景的色度点,离黑体轨迹上哪个点最近。找到最近点,就得到了场景的色温估计值。
实战经验:我在调试AWB时,经常把采集到的色度点画在CIE图上。如果点偏离黑体轨迹太远,说明要么光源是非白炽灯(比如LED、荧光灯),要么算法估计有偏差。这时候需要特殊处理,不能简单用轨迹上的点去校正。
下面这张图,展示了黑体辐射轨迹与常见光源的分布关系:
1.3 人眼视觉恒常性——为什么我们觉得“白色是白色”
这是AWB存在的根本原因。人眼有强大的色彩恒常性(Color Constancy)能力。不管在暖黄灯光下,还是在阴天蓝光下,我们看一张白纸,都觉得它是白的。但相机传感器没有这个能力——它忠实记录物理光谱,拍出来就是偏色。
我做过一个实验:在2800K的台灯下放一张白纸,用手机拍。照片明显偏黄。但人眼在现场看,纸就是白的。这就是恒常性在起作用。
人眼是怎么做到的?主要有三个机制:
- 视网膜适应:视锥细胞对不同波长光的敏感度会动态调整
- 大脑推断:大脑根据场景中的高光、阴影、已知物体颜色,推断光源颜色并“减去”它
- 记忆色:我们记得“白纸是白的”,所以大脑强制修正感知
AWB算法,本质上就是在模仿人眼的色彩恒常性。它要估计出场景的光源颜色,然后把图像校正到“标准光源下看起来的样子”。
注意:人眼恒常性不是完美的。在极端混合光源下(比如一半暖光一半冷光),人眼也会困惑。AWB算法同样会在这类场景下翻车。我遇到过好几次——舞台灯光下,算法把演员的脸校成了灰色。这就是因为光源太复杂,单一色温模型搞不定。
1.4 AWB在ISP Pipeline中的位置
ISP(Image Signal Processor)是一条流水线。传感器输出的原始RAW数据,经过一系列处理,最终变成我们看到的JPG或视频帧。AWB是这条流水线上非常靠前的一环。
典型的ISP Pipeline顺序如下:
| 步骤 | 处理内容 | 说明 |
|---|---|---|
| 1 | 黑电平校正(BLC) | 去除传感器暗电流噪声 |
| 2 | 去马赛克(Demosaic) | 从Bayer阵列恢复全彩 |
| 3 | 自动白平衡(AWB) | 校正色温偏差 |
| 4 | 色彩校正矩阵(CCM) | 将传感器色域映射到标准色域 |
| 5 | Gamma校正 | 非线性亮度映射 |
| 6 | 去噪(NR) | 空间/时域降噪 |
| 7 | 锐化(Sharpening) | 增强边缘 |
为什么AWB要放在这么靠前的位置?因为后面的CCM、Gamma等模块,都假设输入图像已经是“白平衡正确”的。如果AWB没做好,后面的色彩校正会跟着错,最终图像颜色会彻底跑偏。
下面这张流程图,展示了AWB在ISP中的位置和它与其他模块的关系:
1.5 小结——为什么这些基础概念重要
你可能觉得,色温、黑体轨迹、人眼恒常性,这些理论离写代码很远。但我在实际项目中吃过亏:有一次,算法在室内暖光下表现很好,一到户外阴天就偏蓝。查了很久才发现,是色温估计模块把阴天场景的色度点错误地映射到了黑体轨迹的低温区。如果当初对色温轨迹的理解更深一点,这个bug能早两天定位到。
所以我的建议是:别急着调参数,先把这几个概念刻在脑子里。它们是你后面理解灰度世界、完美反射、色温估计等所有AWB算法的基石。
个人习惯:我每次拿到一个新sensor的RAW数据,第一件事就是拍一张灰卡,然后看它的R/G、B/G比值在不同光源下的分布。这个习惯帮我快速摸清sensor的色温响应特性,比看datasheet直观多了。