3 изображения в градациях серого в 1 цветное изображение на Java

Я ищу создание Java-приложения, которое будет принимать 3 изображения в градациях серого (каждое представляет красный, зеленый и синий), а затем объединять их / выравнивать их / и т.д. чтобы создать одно цветное изображение, мне было интересно, знает ли кто-нибудь, существуют ли какие-либо алгоритмы или методы, которые я мог бы использовать? Я понимаю, что есть программа под названием ImageJ, которую я использовал раньше, и она делает именно то, что я ищу; Вы выбираете 3 изображения, и из них можно создать изображение RGB. Я знаю, что это делается в Java с помощью таблицы поиска, с которой я никогда не сталкивался, поэтому даже не знаю, с чего начать.

Если у кого-то есть идеи о том, как лучше всего к нему подойти, существующих алгоритмах, о том, как я могу сделать свои собственные, и т. Д., Это было бы здорово. Я не ищу никого, кто мог бы написать мне код, просто чтобы направить меня в правильном направлении; моя теория итерации каждого пикселя для каждого изображения в градациях серого R, G и B может не сработать?

Спасибо за помощь в продвижении

1 ответ

Решение

Работая в цветовом пространстве sRGB, легко реализовать метод, который делает это.

Рассмотрим следующий метод:

private static BufferedImage createColorFromGrayscale(BufferedImage red, BufferedImage green, BufferedImage blue){
    BufferedImage base = new BufferedImage(red.getWidth(), red.getHeight(), BufferedImage.TYPE_INT_ARGB);

    for(int x = 0;x < red.getWidth();x++){
        for(int y = 0; y < red.getHeight(); y++){
            int rgb = (red.getRGB(x, y) & 0x00FF0000) | (green.getRGB(x, y) & 0x0000FF00) | (blue.getRGB(x, y) & 0x000000FF);

            base.setRGB(x, y, (rgb | 0xFF000000));
        }
    }

    return base;
}

Создавая новое базовое изображение, мы создаем компонент цвета, используя побитовые AND и OR для создания 4-байтового целочисленного цвета в формате ARGB, который назначается базовому изображению. Итерируя по всему изображению с помощью циклов for, мы можем установить каждый пиксель результирующего базового изображения в цвета каждого канала соответственно.

Этот метод предполагает, что все три изображения имеют одинаковый размер. Если изображения не равны по размеру, вы должны обрабатывать это отдельно (например, растягивая изображения перед вводом или изменяя метод для приема изображений другого размера).

PS: может быть более эффективно напрямую использовать один из экземпляров изображения с буферизацией в качестве базового изображения для экономии памяти при работе с большими изображениями...

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