Как преобразовать преобразование цвета Java из RGB в 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]

1 ответ

Решение

Я наконец нашел следующий класс Java...

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

Внутренний класс ColorSpaceConverter имеет преобразования цветового пространства, которые кажутся математически обратимыми. Я взломал внешний класс, так как он является частью какого-то монолитного графического приложения, которое мне не нужно.

Я немного узнал о цветовых пространствах CIEXYZ и CIELAB, но все еще ничего не объясняет, почему стандартные классы JDK не работают так, как должны. В любом случае приведенный выше код работает!

Другие вопросы по тегам