如何将Java颜色转换从RGB转换为CIEXYZ / CIELAB

时间:2018-10-24 14:00:21

标签: java colors color-space lab-color-space

我的最终目标是将RGB转换为CIELAB,进行一些颜色平均,然后再转换回去。因此,我的假设是,如果由于运行时的环境而只有一个颜色输入,即 no averaging ,则变换输出应与RGB输入完全相同,但这不是案子。

CIELAB颜色空间使用对CIEXYZ颜色空间(属于JDK的一部分)的中间转换。这种转变似乎是不可逆的或有损的吗?它是否正确?还是我的假设或执行方式有问题?我应该使用其他方法处理这些颜色吗?

测试并在下面输出。为什么rgb和rgb2颜色不一样?

private static final ColorSpace CIEXYZ =ColorSpace.getInstance(ColorSpace.CS_CIEXYZ);    
@Test
    public void testCiexyz() {
        float[] rgb = new float[] {0.15686275f, 0.2f, 0.20784314f};
        LOGGER.debug("rbg: {}",rgb);
        float[] xyz = CIEXYZ.fromRGB(rgb);
        LOGGER.debug("xyz: {}",xyz);
        float[] rgb2 = CIEXYZ.toRGB(xyz);
        LOGGER.debug("rbg2: {}",rgb2);
    }

输出

    09:46:59.762 [main] DEBUG org.phomos.sampler.ColorTest - rbg: [0.15686275, 0.2, 0.20784314]
        09:46:59.875 [main] DEBUG org.phomos.sampler.ColorTest - xyz: [0.02709961, 0.030670166, 0.0289917]
        09:46:59.911 [main] DEBUG org.phomos.sampler.ColorTest - rbg2: [0.12155337, 0.1400473, 0.1430228]

1 个答案:

答案 0 :(得分:0)

我终于找到了以下Java类...

https://imagej.nih.gov/ij/plugins/download/Color_Space_Converter.java

内部类ColorSpaceConverter具有色彩空间转换,这些转换似乎在数学上都是可逆的。我砍掉了外部类,因为它是一些不需要的整体gui应用程序的一部分。

我在很长一段时间内对CIEXYZ和CIELAB色彩空间学到了一些知识,但是仍然没有任何东西可以解释为什么标准JDK类无法正常工作。无论哪种方式,上面的代码都有效!