Преобразование отрицательного изображения в положительное

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

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

Может ли кто-нибудь дать мне это начало? Образец кода, если возможно, также будет высоко оценен.

Ответ 1

Я только что написал рабочий пример. Учитывая следующее входное изображение img.png.

img.png

Выход будет новым изображением invert-img.png как

invert-img.png

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

class Convert
{
    public static void main(String[] args)
    {
        invertImage("img.png");
    }

    public static void invertImage(String imageName) {
        BufferedImage inputFile = null;
        try {
            inputFile = ImageIO.read(new File(imageName));
        } catch (IOException e) {
            e.printStackTrace();
        }

        for (int x = 0; x < inputFile.getWidth(); x++) {
            for (int y = 0; y < inputFile.getHeight(); y++) {
                int rgba = inputFile.getRGB(x, y);
                Color col = new Color(rgba, true);
                col = new Color(255 - col.getRed(),
                                255 - col.getGreen(),
                                255 - col.getBlue());
                inputFile.setRGB(x, y, col.getRGB());
            }
        }

        try {
            File outputFile = new File("invert-"+imageName);
            ImageIO.write(inputFile, "png", outputFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Если вы хотите создать монохромное изображение, вы можете изменить расчет col примерно так:

int MONO_THRESHOLD = 368;
if (col.getRed() + col.getGreen() + col.getBlue() > MONO_THRESHOLD)
    col = new Color(255, 255, 255);
else
    col = new Color(0, 0, 0);

Вышеупомянутое предоставит вам следующее изображение

monochromic-img.png

Вы можете настроить MONO_THRESHOLD, чтобы получить более приятный вывод. Увеличение числа сделает пиксель темнее и наоборот.

Ответ 2

Попробуйте LookupOp. Вот пример из книги Filthy Rich Clients.

Ответ 3

Тогда начинается его начало. Предполагая, что у вас есть доступ к каждому отдельному пикселю в негативном изображении, и что каждый пиксель имеет компоненты RGB, получите компоненты RGB исходных пикселей следующим образом:

int originalRed   = Math.abs( pixel.getRed( ) - 255 );
int originalGreen = Math.abs( pixel.getGreen( ) - 255 );
int originalBlue  = Math.abs( pixel.getBlue( ) - 255 );
// now build the original pixel using the RGB components

Выполняя вышеуказанное для каждого пикселя, вы можете получить исходное изображение, воссоздав его по пикселям.