我正在尝试将 CIE XY 色度坐标 1931 2deg 颜色空间转换为 CCT 并转换回来。我遵循链接的公式。
McCamy功能:
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 )
}
// TEST RESULTS
print(xyToCCT(x: 0.44758, y: 0.40745)) // A 2857.13110 round to 2857 instead 2856
print(xyToCCT(x: 0.34567, y: 0.35850)) // D50 5002.09743 round to 5002 instead 5003
print(xyToCCT(x: 0.31271, y: 0.32902)) // D65 6504.38938 round to 6504 correct 6504
print(xyToCCT(x: 0.31379, y: 0.34531)) // F5 6345.90175 round to 6346 instead 6350
康2002功能:
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)
}
// TEST RESULTS
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
我的坐标和 CCT 来源 - 维基百科标准光源。
关于为什么结果不正确的想法?也许官方值有舍入误差? 我还没有找到一个官方的 CIE 表格可以参考更精确的坐标或更多小数点的坐标。
那么,是否存在 CIE XY 色度坐标 1964 10deg 的等价公式?
据我了解,常用的 CCT 有几种不同的概念:
对于黑体计算,可以使用观察者的颜色匹配函数精确计算 xy 色度,而标准光源 D 提供其自己的定义。
例如CCT 6504 K...
(0.313465, 0.323569)
(0.313895, 0.324473)
(0.312714, 0.329119)
请注意:
(0.312720, 0.329125)
(0.31272, 0.32903)
的白点是根据XYZ -> xyY
转换公式计算的,而不是使用光谱功率分布方程计算CCT -> xy
。这就是说:成功的一半在于知道您实际上想要匹配哪些价值观。
使用 我自己的库我发现这种方法 Ohno (2013) 可以在 xy 色度与 CCT 和 Duv 之间进行准确的往返转换(在 1 K CCT 和 -0.03 至 0.03 Duv 内)。