Как преобразовать преобразование цвета Java из RGB в CIEXYZ / CIELAB - PullRequest
0 голосов
/ 24 октября 2018

Моя конечная цель - преобразовать 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 Ответ

0 голосов
/ 25 октября 2018

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

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

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

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

...