2017-10-08 69 views
0

我需要能够将Lab颜色转换为XYZ颜色。根据我在其他人的问题中找到的建议,我遵循了这个页面的解释:http://www.brucelindbloom.com/index.html?Eqn_Lab_to_XYZ.html将实验室转换为XYZ

我已经跟着它,但是我的X和Z值是关闭的,但是Y是正确的(我已经测试了它对一个几个在线转换器(它们不显示它们如何转换它))。我一直盯着那个实验室到XYZ网站一会儿,试图找到我的数学错误。

Lab色彩我测试:Lab[41, 48, -19]

XYZ值我得到:XYZ[5676.0352, 0.1186, 4845.2021](该网站说,这个结果应该在范围[0, 1]

referenceXreferenceYreferenceZ是我参考白。颜色值

这里是我的代码(JAVA):

// https://www.mathworks.com/help/images/ref/whitepoint.html 
    // a: 1.0985, 1, 0.3556 
    // c: 0.9807, 1, 1.1822 
    // e: 1,1, 1 
    // d50: 0.9642, 1, 0.8251 
    // d55: 0.9568, 1, 0.9214 
    // d65: 0.9504, 1, 1.0888 
    // icc: 0.9642, 1, 0.8249 (what we're using) 
    double referenceX = 0.9642; 
    double referenceY = 1; 
    double referenceZ = 0.8249; 

    double fy = (this.lightness + 16)/116; 
    double fx = this.a/500 + fy; 
    double fz = fy - this.b/200; 
    //todo make these constants 
    double kappa = 216/24389.0; 
    double epsilon = 24389/27.0; 

    double fx3 = fx * fx * fx; 
    double fz3 = fz * fz * fz; 
    double xr = fx3 > epsilon ? fx3 : (116 * fx - 16)/kappa; 
    double yr = this.lightness > kappa * epsilon ? Math.pow((this.lightness + 16)/116, 3) : this.lightness/kappa; 
    double zr = fz3 > epsilon ? fz3 : (116 * fz - 16)/kappa; 

    double X = xr * referenceX; 
    double Y = yr * referenceY; 
    double Z = zr * referenceZ; 

所以我想我的问题当然是,我的数学有什么问题?或任何人都可以找到另一个网站的方式来做转换(我似乎无法找到任何)?

谢谢。如果您需要任何澄清或有任何问题,请询问。

+2

您交换了'kappa'和'epsilon'的值。 –

回答

0

不知道这里出了什么问题(如果有人知道,请说!),但我最终使用维基百科转换(https://en.wikipedia.org/wiki/Lab_color_space#RGB_and_CMYK_conversions,请参阅逆转换)。我不知道为什么我一开始没有看到这个。

+0

它看起来像布鲁斯Lindbloom网站上的公式是错误的。 –

+1

正如Peter Occil指出的那样,你颠倒了两个常量,否则你的实现看起来很不错。 @Erwin Bolwidt:你认为Bruce Lindbloom参考文献中的错误是什么?它应该很好,实际上整合了为CIE L *提供完美连接点的常量:http://www.brucelindbloom.com/index.html?LContinuity.html –

+0

@KelSolaar是的,谢谢。我不相信我没有看到。该公式确实有效,至少根据我对两个在线转换器进行测试。 (维基百科版本也是如此) – MCMastery