如何反转 Java 从 RGB 到 CIEXYZ / CIELAB 的颜色变换

How to reverse Java color transform from RGB to CIEXYZ / CIELAB

我的最终目标是将 RGB 转换为 CIELAB,进行一些颜色平均,然后再转换回来。所以我的假设是,如果由于运行时情况,只有一个颜色输入,即 没有平均 ,那么转换输出应该与 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]

我终于找到了下面的Java class...

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

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

我很早就了解了 CIEXYZ 和 CIELAB 色彩空间,但仍然无法解释为什么标准 JDK classes 不能正常工作。无论哪种方式,上面的代码都有效!