我的最终目标是将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]
答案 0 :(得分:0)
我终于找到了以下Java类...
https://imagej.nih.gov/ij/plugins/download/Color_Space_Converter.java
内部类ColorSpaceConverter具有色彩空间转换,这些转换似乎在数学上都是可逆的。我砍掉了外部类,因为它是一些不需要的整体gui应用程序的一部分。
我在很长一段时间内对CIEXYZ和CIELAB色彩空间学到了一些知识,但是仍然没有任何东西可以解释为什么标准JDK类无法正常工作。无论哪种方式,上面的代码都有效!