CIE XY 色度转换为 CCT 并返回

问题描述 投票:0回答:1

我正在尝试将 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 的等价公式?

swift colors color-space cct
1个回答
0
投票

据我了解,常用的 CCT 有几种不同的概念:

  • 根据“理想”的平滑光谱功率分布计算的 CCT 黑体辐射器
  • 根据日光光谱功率分布不均匀计算出的CCT(光源系列D

对于黑体计算,可以使用观察者的颜色匹配函数精确计算 xy 色度,而标准光源 D 提供其自己的定义

例如CCT 6504 K...

  • 黑体与 1931 年 2 度观察者 =
    (0.313465, 0.323569)
  • 黑体与 1964 年 10 度观察者 =
    (0.313895, 0.324473)
  • 根据 CIE 光源 D 的日光 =
    (0.312714, 0.329119)

请注意:

  • “6504”通常是“6500 * 1.4388 / 1.4380”的简写,因为常数 c2 正在修订,这使得 CIE 光源 D CCT 为
    (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 内)。

© www.soinside.com 2019 - 2024. All rights reserved.