이미지를 네거티브로 변환하는 알고리즘
이미지를 네거티브(색상 반전) 효과로 바꾸는 원리는 매우 간단합니다. 각 픽셀이 가진 빨강(Red), 초록(Green), 파랑(Blue) 값을 255에서 빼주면 됩니다. 전체 과정은 다음과 같습니다.
이미지 내 각 픽셀의 R(빨강), G(초록), B(파랑) 값을 가져옵니다.
각 색상 값을 255에서 뺀 결과를 새로운 색상 값으로 저장합니다.
변경된 색상 값들을 조합하여 새로운 픽셀 값을 만듭니다.
새로 만든 값을 해당 픽셀에 설정합니다.
Java에서의 구현
Java에서는 ImageIO와 Color 클래스를 활용해 위 알고리즘을 손쉽게 구현할 수 있습니다. 구현 순서는 다음과 같습니다.
ImageIO.read()메서드를 사용하여 대상 이미지를 불러옵니다.이미지의 높이(height)와 너비(width)를 구합니다.
중첩 for문을 사용하여 이미지의 모든 픽셀을 하나씩 순회합니다.
getRGB()메서드로 현재 픽셀의 값을 가져옵니다.가져온 픽셀 값을 매개변수로 전달하여
Color객체를 생성합니다.getRed(),getGreen(),getBlue()메서드를 사용해 Color 객체에서 R, G, B 값을 각각 추출합니다.알고리즘에 명시된 대로 새로운 R, G, B 값을 계산합니다(255에서 기존 값을 뺌).
계산된 새 RGB 값을 매개변수로 하여 새로운
Color객체를 생성합니다.새 Color 객체로부터 최종 픽셀 값을 얻습니다.
setRGB()메서드를 사용하여 새로운 픽셀 값을 이미지에 설정합니다.
예제 코드
import java.io.File;
import java.io.IOException;
import java.awt.Color;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
public class Color2Negative {
public static void main(String args[])throws IOException {
//Reading the image
File file= new File("D:\\Images\\car3.jpg");
BufferedImage img = ImageIO.read(file);
for (int y = 0; y < img.getHeight(); y++) {
for (int x = 0; x < img.getWidth(); x++) {
//Retrieving the values of a pixel
int pixel = img.getRGB(x,y);
//Creating a Color object from pixel value
Color color = new Color(pixel, true);
//Retrieving the R G B values
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
//Subtracting RGB from 255 to convert into negative
red = 255-red;
green = 255-green;
blue = 255-blue;
//Creating new Color object
color = new Color(red, green, blue);
int newPixel = color.getRGB();
//Setting new Color object to the image
img.setRGB(x, y, newPixel);
}
}
//Saving the modified image
file = new File("D:\\Images\\negative_image.jpg");
ImageIO.write(img, "jpg", file);
System.out.println("Done...");
}
}
위 코드는 D:\Images\car3.jpg 파일을 읽어 모든 픽셀의 색상을 반전시킨 뒤, 결과를 negative_image.jpg라는 이름으로 저장합니다. 처리가 완료되면 콘솔에 "Done..." 메시지가 출력됩니다.
입력 이미지

출력 이미지

실행 결과, 원본 이미지의 밝은 부분은 어둡게, 어두운 부분은 밝게 반전되어 필름 카메라 시절 사진 네거티브와 같은 효과를 확인할 수 있습니다. 이 방식은 OpenCV의 cv2.bitwise_not() 함수나 Python Pillow 라이브러리로도 동일하게 구현할 수 있으며, 이미지 처리의 기본 개념인 픽셀 단위 연산을 이해하는 데 큰 도움이 됩니다.