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
相关产品推荐
相关产品推荐

