You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CIE 1931 2°XY色度坐标与CCT互转偏差问题及1964 10°公式问询

CIE 1931 2°色度坐标与相关色温(CCT)互转测试

McCamy函数(XY转CCT)

func xyToCCT(x: Double, y: Double) -> Int {
    let n = (x - 0.3320) / (y - 0.1858)
    return Int( (-449 * pow(n, 3)) + (3525 * pow(n, 2)) - (6823.3 * n) + 5520.33 )
}

// 测试结果
print(xyToCCT(x: 0.44758, y: 0.40745)) // A光源:计算值2857.13110,取整2857,标准值2856
print(xyToCCT(x: 0.34567, y: 0.35850)) // D50光源:计算值5002.09743,取整5002,标准值5003
print(xyToCCT(x: 0.31271, y: 0.32902)) // D65光源:计算值6504.38938,取整6504,与标准值一致
print(xyToCCT(x: 0.31379, y: 0.34531)) // F5光源:计算值6345.90175,取整6346,标准值6350

Kang 2002函数(CCT转XY)

func cctToXY(k: Int) -> (x: Double, y: Double)? {
    let k = k
    
    guard k > 1667 && k < 25000 else {
        return nil
    }
    
    let cct_3 = pow(Double(k), 3)
    let cct_2 = pow(Double(k), 2)
    
    var x: Double {
        if k <= 4000 {
            return -0.2661239 * pow(10, 9) / cct_3 - 0.2343589 * pow(10, 6) / cct_2 + 0.8776956 * pow(10, 3) / Double(k) + 0.17991
        } else {
            return -3.0258469 * pow(10, 9) / cct_3 + 2.1070379 * pow(10, 6) / cct_2 + 0.2226347 * pow(10, 3) / Double(k) + 0.24039
        }
    }
    
    let x_3 = pow(x, 3)
    let x_2 = pow(x, 2)
    
    var y: Double {
        if k <= 2222 {
            return -1.1063814 * x_3 - 1.34811020 * x_2 + 2.18555832 * x - 0.20219683
        } else if k <= 4000 {
            return -0.9549476 * x_3 - 1.37418593 * x_2 + 2.09137015 * x - 0.16748867
        } else {
            return 3.0817580 * x_3 - 5.8733867 * x_2 + 3.75112997 * x - 0.37001483
        }
    }
    
    return (x: x, y: y)
}

// 测试结果
print(cctToXY(k: 2856)!) // 计算值x: 0.4470706750966438 y: 0.40750879834778053
                         // A光源标准值x: 0.44758 y: 0.40745

print(cctToXY(k: 5003)!) // 计算值x: 0.3449074537491241 y: 0.35151935324713224
                         // D50光源标准值x: 0.34567 y: 0.35850

print(cctToXY(k: 6504)!) // 计算值x: 0.313432036002229 y: 0.323601871509382
                         // D65光源标准值x: 0.31271 y: 0.32902

print(cctToXY(k: 6350)!) // 计算值x: 0.3158877226651461 y: 0.3259845718669351
                         // F5光源标准值x: 0.31379 y: 0.34531

问题解答

1. 结果偏差的原因

偏差主要来自三个核心因素:

  • 拟合公式的固有局限性:McCamy和Kang 2002公式均为经验拟合式,是基于黑体辐射体的色温轨迹(普朗克轨迹)做多项式拟合得到的近似表达式,并非严格物理推导结果。这类公式仅能在特定范围内接近真实值,对偏离黑体轨迹的光源(如F系列荧光灯)误差会明显增大。
  • 标准光源的非黑体特性:D50、F5等标准光源并非严格的黑体辐射体,它们的色度坐标本身就不在黑体轨迹上。Kang公式是针对黑体轨迹的拟合,用它计算非黑体光源的坐标,必然会出现偏差。
  • 标准值的精度取舍:公开的标准值通常是经过舍入的简化版本,比如A光源的高精度CCT为2855.6K(取整为2856K),高精度坐标为(0.44757, 0.40745)。你使用的是舍入后的坐标计算,微小的数值差异会导致CCT结果的小幅偏差,属于正常精度范围。

2. CIE官方高精度坐标获取

CIE官方的高精度标准光源参数可在《CIE 15:2004 Colorimetry》(色度学手册)中找到,其中包含所有标准光源的精确XY坐标与CCT值。若无法获取官方出版物,可查询色彩科学领域的权威学术数据库或专业文献,部分机构会公开这类高精度数据。

3. CIE 1964 10°色度坐标的转换公式

针对CIE 1964 10°视场的XY与CCT互转,有专门的拟合方案:

  • XY转CCT:可使用Hernández-Andrés等人提出的适配10°视场的公式:
    func xy10ToCCT(x: Double, y: Double) -> Double {
        let n = (x - 0.3366) / (y - 0.1735)
        return (-460706919 * pow(n, 3) + 296397717 * pow(n, 2) - 52681117 * n + 3574645.9) / 1000
    }
    
  • CCT转XY:可使用针对10°视场修正的Kang公式,或CIE推荐的黑体轨迹拟合式,核心是调整拟合参数以适配10°视场的色度函数。不推荐通过坐标转换(10°转2°)再用原有公式计算,会引入额外误差。

内容的提问来源于stack exchange,提问作者Joannes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:22:14