首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Lab转换为XYZ

将Lab转换为XYZ
EN

Stack Overflow用户
提问于 2017-10-08 11:56:18
回答 1查看 2K关注 0票数 0

我需要能够将Lab颜色转换为XYZ颜色。我遵循了这个页面的解释,基于我在别人的问题上找到的建议:http://www.brucelindbloom.com/index.html?Eqn_Lab_to_XYZ.html

我遵循了它,但是我的X和Z值相差很远,但是Y是正确的(我已经在几个在线转换器上测试了它(它们没有显示它们是如何转换的…))。我已经盯着Lab to XYZ网站看了一段时间,试图找出我数学上的一个错误。

我测试它的Lab颜色是:Lab[41, 48, -19]

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

referenceYreferenceZ是我参考的白色颜色值。

下面是我的代码(Java):

代码语言:javascript
复制
    // 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;

所以我想我的问题是,我的数学出了什么问题?或者,有没有人可以找到另一个网站来进行转换(我似乎找不到)?

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

EN

回答 1

Stack Overflow用户

发布于 2017-10-08 12:08:35

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46627367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档