4. 色温与光源:黑体辐射轨迹、标准光源(D65/A/Horizon)、色温估算基础
白平衡校正的本质是消除光源色温对图像色彩的影响,使白色物体在任何光源下都呈现为中性白。理解色温、黑体辐射轨迹与标准光源,是进行精确白平衡估算与调试的理论基石。本章将系统梳理这些核心概念,并介绍驱动开发中常用的色温估算方法。
4.1 色温与黑体辐射轨迹
色温(Color Temperature)是描述光源颜色的物理量,单位为开尔文(K)。其定义基于理想黑体辐射体:当黑体被加热到一定温度时,会发出特定颜色的光。温度越低,光色越偏红;温度越高,光色越偏蓝。
关键概念: 色温不是光源的实际温度,而是人眼对光源颜色的视觉感知度量。例如,烛光的色温约为 1800K(偏红),正午阳光约为 5500K(中性白),阴天天空约为 7000K(偏蓝)。
将不同温度下黑体辐射的色度坐标(通常使用 CIE 1931 色度图上的 u'、v' 坐标)连接起来,就形成了 黑体辐射轨迹(Planckian Locus)。这条轨迹是白平衡校正的基准线——理想的白平衡算法应使图像中的白色物体沿此轨迹移动,直至达到目标色温。
4.2 标准光源:D65、A、Horizon
为了在图像处理中统一参考基准,国际照明委员会(CIE)定义了若干标准光源。在 Camera 驱动调试中,最常遇到的是以下三种:
| 标准光源 | 相关色温 (CCT) | 光谱特征 | 典型应用场景 |
|---|---|---|---|
| D65 | 6504 K | 模拟平均昼光,包含紫外成分 | 显示器白点、图像编辑、国际标准测试 |
| A | 2856 K | 模拟钨丝灯(白炽灯),光谱偏红 | 室内照明、低色温场景调试 |
| Horizon | 2300 K | 模拟日出/日落时的地平线光,极暖 | 特殊氛围场景、极端低色温测试 |
驱动调试提示: 在 ISP 白平衡模块的标定阶段,通常需要采集 D65、A、Horizon 三种光源下的灰卡图像,用于计算颜色校正矩阵(CCM)和增益映射表。缺少任一光源的标定数据,都可能导致特定场景下的白平衡偏差。
4.3 色温估算基础方法
在 Camera 驱动中,色温估算通常由 ISP 的 AWB 统计模块完成。其核心思想是:从图像中提取白色或中性色区域,分析其 R/G 和 B/G 比值,然后映射到黑体辐射轨迹上,从而推算出当前光源的色温。
4.3.1 基于 R/G 与 B/G 的色温估算
这是最经典的估算方法,流程如下:
- 统计采集: 将图像划分为 M×N 个块,计算每个块的 R/G 和 B/G 均值。
- 白点筛选: 剔除过暗、过亮、饱和度过高的块,保留接近中性色的候选块。
- 轨迹匹配: 将候选块的 (R/G, B/G) 坐标与预标定的黑体辐射轨迹曲线进行距离计算。
- 色温输出: 选择距离最近的轨迹点对应的色温值作为估算结果。
驱动实现要点: 预标定的轨迹数据通常以查找表(LUT)形式存储在 Camera 驱动中。LUT 的精度直接影响估算准确性——建议在 2000K~10000K 范围内每 100K 采样一个点,共 81 个点。
4.3.2 色温估算的常见问题与避坑
| 问题 | 现象 | 驱动层解决方案 |
|---|---|---|
| 光源不在轨迹上 | 荧光灯、LED 等非连续光谱光源 | 引入偏移量校正,或使用多维查找表 |
| 场景中无白色物体 | 色温估算结果漂移 | 启用场景分类器,结合人脸/肤色检测辅助判断 |
| 混合光源 | 室内窗边(日光+灯光) | 采用区域色温估算,分块处理后再融合 |
| 低照度噪声干扰 | R/G、B/G 统计值波动大 | 增加时域滤波,或提高统计窗口的 SNR 阈值 |
调试警告: 在驱动开发阶段,切勿直接使用默认的色温估算参数。必须针对目标 Camera 模组的光学特性(镜头透过率、传感器光谱响应)重新标定轨迹 LUT。使用通用 LUT 会导致白平衡收敛慢甚至振荡。
4.4 色温估算在驱动中的代码实现片段
以下是一个简化的色温估算函数,展示了如何将 R/G、B/G 映射到色温值:
// 色温查找表结构体
typedef struct {
uint16_t rg; // R/G 值 (Q10 格式)
uint16_t bg; // B/G 值 (Q10 格式)
uint16_t cct; // 对应色温 (K)
} awb_cct_lut_t;
// 色温估算函数
uint16_t awb_estimate_cct(uint16_t rg_avg, uint16_t bg_avg,
const awb_cct_lut_t *lut, uint32_t lut_size)
{
uint32_t min_dist = 0xFFFFFFFF;
uint16_t best_cct = 5500; // 默认返回 D55
for (uint32_t i = 0; i < lut_size; i++) {
int32_t diff_rg = (int32_t)rg_avg - (int32_t)lut[i].rg;
int32_t diff_bg = (int32_t)bg_avg - (int32_t)lut[i].bg;
uint32_t dist = (uint32_t)(diff_rg * diff_rg + diff_bg * diff_bg);
if (dist < min_dist) {
min_dist = dist;
best_cct = lut[i].cct;
}
}
return best_cct;
}
性能优化建议: 上述代码采用全遍历查找,在 LUT 规模较大时可能影响实时性。实际驱动中可改用二分查找(如果 LUT 按色温有序排列)或使用硬件加速的统计引擎直接输出色温索引。
4.5 本章小结
- 色温是描述光源颜色的物理量,黑体辐射轨迹是白平衡校正的基准线。
- 标准光源 D65(6504K)、A(2856K)、Horizon(2300K)是驱动标定的三大参考光源。
- 色温估算的核心方法是通过 R/G 和 B/G 比值匹配预标定的轨迹 LUT。
- 驱动开发中必须针对具体模组重新标定 LUT,并处理非连续光谱、混合光源等复杂场景。