java - JzAzBz java实现精度

标签 java colors

我制作了新的感知统一颜色空间 JzAzBz 的 Java 实现。 OSA 出版物是:https://www.osapublishing.org/oe/fulltext.cfm?uri=oe-25-13-15131&id=368272 .

我的java代码是:

private double b = 1.15;
private double g = 0.66;
private double c1 = 3424 / Math.pow(2, 12);
private double c2 = 2413 / Math.pow(2, 7);
private double c3 = 2392 / Math.pow(2, 7);
private double n = 2610 / Math.pow(2, 14);
private double p = 1.7 * 2523 / Math.pow(2, 5);
private double d = -0.56;
private double d0 = 1.6295499532821566 * Math.pow(10, -11);

public void XYZToJab(double[] xyz, double[] jab) {
    double[] XYZp = new double[3];
    XYZp[0] = b * xyz[0] - ((b - 1) * xyz[2]);
    XYZp[1] = g * xyz[1] - ((g - 1) * xyz[0]);
    XYZp[2] = xyz[2];

    double[] LMS = new double[3];
    LMS[0] = 0.41478972 * XYZp[0] + 0.579999 * XYZp[1] + 0.0146480 * XYZp[2];
    LMS[1] = -0.2015100 * XYZp[0] + 1.120649 * XYZp[1] + 0.0531008 * XYZp[2];
    LMS[2] = -0.0166008 * XYZp[0] + 0.264800 * XYZp[1] + 0.6684799 * XYZp[2];

    double[] LMSp = new double[3];
    for (int i = 0; i < 3; i++) {
        LMSp[i] = Math.pow((c1 + c2 * Math.pow((LMS[i] / 10000.0), n)) / (1 + c3 * Math.pow((LMS[i] / 10000.0), n)), p);
    }

    double[] Iab = new double[3];
    Iab[0] = 0.5 * LMSp[0] + 0.5 * LMSp[1];
    Iab[1] = 3.524000 * LMSp[0] - 4.066708 * LMSp[1] + 0.542708 * LMSp[2];
    Iab[2] = 0.199076 * LMSp[0] + 1.096799 * LMSp[1] - 1.295875 * LMSp[2];

    jab[0] = (((1 + d) * Iab[0]) / (1 + d * Iab[0])) - d0;
    jab[1] = Iab[1];
    jab[2] = Iab[2];
}

public void JabToXYZ(double[] jab, double[] xyz) {

    double[] Iab = new double[3];
    Iab[0] = (jab[0] + d0) / (1 + d - d * (jab[0] + d0));
    Iab[1] = jab[1];
    Iab[2] = jab[2];

    double[] LMSp = new double[3];
    LMSp[0] = 1.0 * Iab[0] + 0.13860504 * Iab[1] + 0.05804732 * Iab[2];
    LMSp[1] = 1.0 * Iab[0] - 0.13860504 * Iab[1] - 0.05804732 * Iab[2];
    LMSp[2] = 1.0 * Iab[0] - 0.09601924 * Iab[1] - 0.81189190 * Iab[2];

    double[] LMS = new double[3];
    for (int i = 0; i < 3; i++) {
        LMS[i] = 10000 * Math.pow((c1 - Math.pow(LMSp[i], 1 / p)) / ((c3 * Math.pow(LMSp[i], 1 / p)) - c2), 1 / n);
    }

    double[] XYZp = new double[3];
    XYZp[0] = 1.92422644 * LMS[0] - 1.00479231 * LMS[1] + 0.03765140 * LMS[2];
    XYZp[1] = 0.35031676 * LMS[0] + 0.72648119 * LMS[1] - 0.06538442 * LMS[2];
    XYZp[2] = -0.09098281 * LMS[0] - 0.31272829 * LMS[1] + 1.52276656 * LMS[2];

    xyz[0] = (XYZp[0] + (b - 1) * XYZp[2]) / b;
    xyz[1] = (XYZp[1] + (g - 1) * XYZp[0]) / g;
    xyz[2] = XYZp[2];
}

当我运行 XYZToJab 和 JabToXYZ 进行测试时,X 和 Z 的精度很高(增量顺序为 E-9),但 Y 的精度很差(增量顺序为 1-5%)。

有谁可以帮助我吗?

最佳答案

实现几乎是正确的:错误在于 JabToXYZ ,其中最后一行之前应该更改

(XYZp[1] + (g - 1) * XYZp[0]) / g;

(XYZp[1] + (g - 1) * xyz[0]) / g;

然而,您在 JabToXYZ 函数中使用舍入到小数点后 6 位的求逆矩阵这一事实将阻止您获得干净的求逆。您应该尝试以全 double 计算逆:

>>> import numpy as np
>>> np.set_printoptions(formatter={'float': '{:0.15f}'.format})
>>> import colour.models.jzazbz
>>> colour.models.jzazbz.JZAZBZ_IZAZBZ_TO_LMS_P_MATRIX
array([[1.000000000000000, 0.138605043271539, 0.058047316156119],
       [1.000000000000000, -0.138605043271539, -0.058047316156119],
       [1.000000000000000, -0.096019242026319, -0.811891896056039]])
>>> colour.models.jzazbz.JZAZBZ_LMS_TO_XYZ_MATRIX
array([[1.924226435787607, -1.004792312595365, 0.037651404030618],
       [0.350316762094999, 0.726481193931655, -0.065384422948085],
       [-0.090982810982848, -0.312728290523074, 1.522766561305260]])

关于java - JzAzBz java实现精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49464451/

相关文章:

javascript - 根据 DOM 元素的 RGB 或十六进制值切换颜色

r - 使用 R/ggplot2 控制中间值颜色

java - 使用 spring-data-mongodb 持久化包含对象的对象

Java-webservice : Glassfish3. 0 错误 "org.codehaus.jackson.jaxrs.JacksonJsonProvider"

java - 获取您在 JPanel 上单击的位置的颜色?

colors - 更改TabLayout的选定选项卡背景和文本颜色

java - 2 使用 Maven 包含 jar 时缺少依赖项

java - 尝试只使用一个方法名称

java - 当 toString() 和 hashCode() 被覆盖时,如何在 java 中获取对象的 "object reference"?

python - 用python计算相似色