4、色温调节核心算法:色温概念(开尔文)

好,咱们进入色温调节的核心部分了。说实话,色温这个概念,很多刚入行的工程师容易搞混。我刚开始做车载显示时,也犯过糊涂——以为色温就是「颜色的温度」,其实没那么简单。

4.1 色温到底是什么?

色温,用大白话说,就是描述光源颜色「偏暖还是偏冷」的一个数值。单位是开尔文(K)。

你想想看,一个铁块被加热,温度低的时候发红光,温度高了发蓝光。色温就是这么来的——把光源的颜色和「黑体辐射」的颜色做对比。

  • 低色温(2000K-3500K):偏暖,像烛光、日出日落的光
  • 中色温(4000K-5500K):中性白,像正午阳光
  • 高色温(6000K-10000K):偏冷,像阴天的天空、LED冷白光

关键点:色温越高,颜色越冷(偏蓝);色温越低,颜色越暖(偏红)。这个和直觉是反的,注意别搞混了。

我在项目中遇到过一位测试同事,他坚持说「高色温应该是暖色」,结果调了一整天参数都不对。嗯,后来我给他画了个黑体辐射曲线,他才明白过来。

4.2 CIE色度图——色温的「地图」

色温不是孤立存在的。要理解色温调节,必须先看懂CIE色度图。说白了,它就是一张颜色的「地图」。

CIE 1931色度图,是一个马蹄形的二维坐标图:

  • x轴:红色分量
  • y轴:绿色分量
  • 蓝色分量:通过 z = 1 - x - y 计算得到

马蹄形的边缘,是纯光谱色。中间区域是混合色。而色温,就在这个图上画了一条曲线——叫做「黑体轨迹」或「普朗克轨迹」。

我的经验:实际项目中,我们不会直接用黑体轨迹上的点。因为车载屏幕的色域有限,只能逼近。我一般会取黑体轨迹附近、且落在屏幕色域内的点作为目标色温。

为什么会这样?因为屏幕的RGB三原色只能覆盖一个三角形区域,黑体轨迹上的很多点,屏幕根本显示不出来。你想想看,如果目标色温在色域外,算法再怎么调也没用。

4.3 基于环境光的色温补偿

好,理论讲完了,咱们说点实际的。车载显示为什么要调色温?

核心原因就一个:人眼的色适应

你从阳光明媚的户外钻进车里,眼睛还处在「日光适应」状态。如果屏幕还是6500K的标准色温,你会觉得屏幕偏蓝。反过来,晚上开车,车内灯光偏暖,6500K的屏幕就显得刺眼、偏冷。

所以,色温补偿的逻辑是:

  1. 环境光色温高(偏蓝) → 屏幕色温调低(偏暖),补偿人眼的色适应
  2. 环境光色温低(偏暖) → 屏幕色温调高(偏冷),保持视觉平衡

说白了,就是「环境暖,屏幕冷;环境冷,屏幕暖」。这个和亮度调节正好相反——亮度是环境亮屏幕亮,环境暗屏幕暗。

注意:色温补偿不能过度。我曾经见过一个方案,环境光色温3000K时,屏幕色温直接拉到10000K。结果用户反馈「屏幕发蓝得吓人」。补偿幅度一般控制在±2000K以内比较安全。

4.4 核心算法实现

色温补偿的核心算法,其实就三步:

  1. 采集环境光色温:通过RGB传感器或色温传感器获取当前环境光的色温值 T_env
  2. 计算目标色温:根据补偿曲线,计算屏幕的目标色温 T_target
  3. 映射到RGB:将目标色温转换为屏幕的RGB增益值

这里我给出一个简单的补偿模型:

// 环境光色温补偿算法(简化版)
// T_env: 环境光色温 (K)
// T_base: 屏幕基准色温 (通常6500K)
// K: 补偿系数 (0.3 ~ 0.7,根据车型调校)

float calculateTargetColorTemp(float T_env, float T_base, float K) {
    // 补偿量 = (基准色温 - 环境色温) * 补偿系数
    float delta = (T_base - T_env) * K;
    
    // 目标色温 = 基准色温 + 补偿量
    float T_target = T_base + delta;
    
    // 限幅,防止过度补偿
    if (T_target < 4500.0f) T_target = 4500.0f;
    if (T_target > 8500.0f) T_target = 8500.0f;
    
    return T_target;
}

这个模型很简单,但实际项目中够用了。补偿系数K怎么定?我建议做主观评价实验——找10个人,在不同环境光下调节K值,取平均值。

4.5 色温到RGB的转换

有了目标色温,怎么转成RGB增益?这里要用到色温到XYZ再到RGB的转换矩阵。

标准流程是:

  1. 色温T → CIE 1931色度坐标 (x, y)
  2. 色度坐标 (x, y) → XYZ三刺激值
  3. XYZ → 线性RGB(通过屏幕的色域转换矩阵)
  4. 线性RGB → 伽马校正后的RGB增益

第1步,可以用Robertson算法或查找表。我习惯用查找表,因为车载MCU算力有限,实时计算太慢。

避坑指南:我曾经直接用网上找的色温转RGB公式,结果在低色温段出现了负的R值。后来才发现,那个公式是针对sRGB色域的,而车载屏幕的色域通常是NTSC或DCI-P3。一定要用屏幕自己的色域矩阵。

4.6 实际调校建议

最后,给几个我在项目中总结的经验:

  • 不要追求绝对准确:人眼对色温的感知是非线性的,±200K的误差根本感觉不出来
  • 注意过渡平滑:色温变化要加渐变,突然跳变会让用户觉得「闪了一下」
  • 留一个手动模式:自动调节再智能,也架不住用户有自己的偏好

嗯,色温调节这块,说白了就是「让屏幕的颜色融入环境」。算法不难,难的是调出让人舒服的感觉。这个只能靠反复试、反复调,没有捷径。

下一章咱们讲色温和亮度的联动调节——这两个参数不是独立的,它们会互相影响。到时候我会分享一个我踩过的坑,挺有意思的。