2. 光源与色温:常见光源色温表、色温与RGB响应的关系、色温对图像色调的影响
做AWB这么多年,我最大的感触就是——不懂光源,就别谈白平衡。你想想看,相机拍到的颜色,本质上就是光源照到物体上再反射进镜头的结果。光源一变,整个画面的色调就跟着跑偏。
这一章,咱们就把光源和色温这件事彻底聊透。我会把常见光源的色温值、RGB传感器对不同色温的响应规律,以及色温怎么影响最终图像色调,掰开揉碎了讲清楚。
2.1 常见光源色温表
先上一张我平时做项目时经常参考的色温表。这张表我用了快十年,每次调试新传感器平台,第一件事就是拿它来校准。
| 光源类型 | 色温范围 (K) | 典型场景 | 色调倾向 |
|---|---|---|---|
| 烛光 / 火焰 | 1500 - 2000 | 烛光晚餐、篝火 | 极暖橙红 |
| 白炽灯 (钨丝灯) | 2500 - 3000 | 家用台灯、老式灯泡 | 暖黄 |
| 卤素灯 | 3000 - 3200 | 射灯、车灯 | 暖白 |
| 日出 / 日落 | 2000 - 3500 | 户外自然光 | 金黄 / 橙红 |
| 暖色荧光灯 | 3000 - 3500 | 办公室、商场 | 暖白偏黄 |
| 冷色荧光灯 | 4000 - 5000 | 学校、医院 | 中性偏冷 |
| 日光 (正午) | 5000 - 5500 | 户外晴天 | 标准白光 |
| 闪光灯 (相机) | 5500 - 6000 | 室内补光 | 中性白 |
| 阴天 / 阴影 | 6000 - 7500 | 多云、树荫下 | 冷蓝 |
| LED (暖白) | 2700 - 3500 | 家用照明 | 暖黄 |
| LED (冷白) | 5000 - 6500 | 办公、工业 | 冷白偏蓝 |
| 蓝天 (无云) | 8000 - 12000 | 高海拔、雪地阴影 | 深蓝 |
个人习惯:我一般在实验室里备三盏标准光源——D65(6500K)、D50(5000K)和A光源(2856K)。这三盏灯基本覆盖了从冷到暖的绝大部分场景。调试AWB算法时,先用它们把基础曲线拉平,再处理混合光源。
2.2 色温与RGB响应的关系
好,表看完了。接下来咱们聊聊核心问题:色温到底怎么影响RGB传感器的输出?
说白了,不同色温的光源,其光谱能量分布是完全不同的。低色温光源(比如白炽灯)在红光波段能量强,蓝光波段能量弱。高色温光源(比如阴天)正好反过来,蓝光多,红光少。
而我们的CMOS传感器,上面的R、G、B滤色片对不同波长的光敏感度是固定的。这就导致了一个现象:
- 低色温(暖光)下:R通道信号强,B通道信号弱。拍出来的画面偏红/黄。
- 高色温(冷光)下:B通道信号强,R通道信号弱。拍出来的画面偏蓝。
- 中间色温(5500K左右):R、G、B三个通道响应相对均衡,就是我们常说的“标准白光”。
我举个例子你就明白了。假设你用一个白平衡已经锁死在5500K的相机,去拍一张白纸:
- 在2800K的白炽灯下,白纸会变成橙黄色。因为R通道增益不够,B通道又太弱。
- 在6500K的阴天下,同一张白纸会变成淡蓝色。因为B通道过强,R通道跟不上。
这就是AWB要干的事——根据光源色温,动态调整R、G、B三个通道的增益,让白纸在任何光源下都还原成白色。
核心公式(简化版):
R_gain = G_avg / R_avg
B_gain = G_avg / B_avg
其中R_avg、G_avg、B_avg是图像中“疑似白色区域”的通道均值。AWB算法本质上就是在不断估算这三个值。
R_gain = G_avg / R_avg
B_gain = G_avg / B_avg
其中R_avg、G_avg、B_avg是图像中“疑似白色区域”的通道均值。AWB算法本质上就是在不断估算这三个值。
2.3 色温对图像色调的影响
这一节,咱们用一张SVG图把色温与色调的关系彻底讲透。我习惯把色温想象成一条从暖到冷的渐变带,RGB三个通道的响应曲线在这条带上此消彼长。
从这张图里你能很直观地看到:
- 低色温区(左侧):红色曲线高高在上,蓝色曲线沉在底部。这就是为什么白炽灯下拍出来的照片总是暖洋洋的。
- 中间色温区(5500K附近):三条曲线交汇在一起,RGB响应基本平衡。这也是为什么我们把5500K定义为“标准白”。
- 高色温区(右侧):蓝色曲线反超,红色曲线跌到谷底。阴天拍出来的照片发蓝,就是这个道理。
我曾经踩过的坑:有一次在调试一款手机摄像头时,发现AWB在LED混合光源下总是偏绿。查了两天才发现,问题出在G通道的响应曲线在4000K-5000K区间有一个异常凸起。后来我在算法里加了一个针对LED光谱的补偿因子,才把这个问题压下去。所以,不要完全相信理论曲线,实际传感器的光谱响应一定要实测。
2.4 实战中的色温判断技巧
理论讲完了,咱们来点实际的。在AWB算法里,判断当前场景的色温是第一步。我总结了几个实战中常用的判断方法:
- 灰度世界法:假设场景中所有颜色的平均值是灰色。如果R_avg > G_avg > B_avg,说明是低色温;反过来就是高色温。这个方法简单,但遇到大面积单色场景(比如蓝天、绿草地)就会翻车。
- 白点检测法:在图像中寻找“疑似白色”的区域(R、G、B值都比较高且接近),用这些区域的色温来代表整个场景。这个方法更准,但计算量大。
- 色温查找表:提前标定好不同光源下R/G和B/G的比值,做成一张查找表。运行时直接查表匹配。我习惯在实验室里用色卡和分光辐射计把这张表做细,能覆盖20种以上常见光源。
我的建议:实际产品中,不要只用一种方法。我通常的做法是“白点检测法为主,灰度世界法做兜底”。当白点检测法找不到足够多的白点时,自动切换到灰度世界法。这样既能保证精度,又能防止极端场景下算法崩溃。