Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java OpenCV 라이브러리로 이미지의 픽셀(RGB 값)을 설정하고 수정하는 방법

이미지 픽셀과 ARGB 값의 이해

픽셀(pixel)은 디지털 이미지를 구성하는 가장 작은 단위 요소입니다. 각 픽셀에는 알파(alpha), 빨강(red), 초록(green), 파랑(blue) 네 가지 값이 포함되어 있으며, 이 값들은 32비트 메모리 공간에 ARGB 순서대로 각 8비트씩 저장됩니다.

따라서 이미지의 색상을 수정하려면 다음과 같은 과정을 거쳐야 합니다.

  • 반복문을 통해 이미지의 모든 픽셀을 하나씩 순회합니다.
  • getRGB() 메서드를 사용하여 픽셀 값을 가져옵니다.
  • 가져온 픽셀 값에서 ARGB 값을 추출합니다.
  • RGB 값에 필요한 수정을 적용합니다.
  • 수정된 RGB 값으로 새로운 픽셀 값을 생성합니다.
  • setRGB() 메서드를 사용하여 새 픽셀 값을 이미지에 설정합니다.

Color 객체로 ARGB 값 설정하기

픽셀 값을 매개변수로 전달하여 Color 객체를 인스턴스화한 후, getRed(), getGreen(), getBlue() 메서드를 사용해 각각 빨강, 초록, 파랑 값을 얻을 수 있습니다. 수정한 값을 다시 이미지에 적용하려면 아래 단계를 따릅니다.

  • 새로운 RGB 값을 매개변수로 전달하여 Color 객체를 생성합니다.
  • Color 클래스의 getRGB() 메서드를 사용하여 해당 객체에서 픽셀 값을 가져옵니다.
  • x, y 좌표와 새 픽셀 값을 setRGB() 메서드에 전달하여 이미지에 새 픽셀 값을 설정합니다.

예제 코드

import java.io.File;
import java.io.IOException;
import java.awt.Color;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
public class SetPixels {
    public static void main(String args[])throws IOException {
        // 이미지 읽기
        File file= new File("D:\\Images\\cat.jpg");
        BufferedImage img = ImageIO.read(file);
        for (int y = 0; y < img.getHeight(); y++) {
            for (int x = 0; x < img.getWidth(); x++) {
                // 픽셀 값 가져오기
                int pixel = img.getRGB(x,y);
                // 픽셀 값으로 Color 객체 생성
                Color color = new Color(pixel, true);
                // R, G, B 값 추출
                int red = color.getRed();
                int green = color.getGreen();
                int blue = color.getBlue();
                // RGB 값 수정
                green = 150;
                blue = 150;
                // 새 Color 객체 생성
                color = new Color(red, green, blue);
                // 새 색상을 이미지에 설정
                img.setRGB(x, y, color.getRGB());
            }
        }
        // 수정된 이미지 저장
        file = new File("D:\\Images\\setting_pixels.jpg");
        ImageIO.write(img, "jpg", file);
        System.out.println("Done...");
    }
}

입력 이미지

Java OpenCV 라이브러리로 이미지의 픽셀(RGB 값)을 설정하고 수정하는 방법

출력 결과

Java OpenCV 라이브러리로 이미지의 픽셀(RGB 값)을 설정하고 수정하는 방법

시프트 연산자를 활용한 ARGB 값 설정

픽셀 값에서 각 색상 성분을 개별적으로 추출하려면, 해당 색상의 시작 비트 위치까지 오른쪽으로 시프트한 뒤 0Xff와 비트 AND 연산을 수행해야 합니다. 알파는 24비트, 빨강은 16비트, 초록은 8비트씩 오른쪽으로 시프트하면 됩니다. 0Xff와의 AND 연산은 변수를 마스킹하여 마지막 8비트만 남기고 나머지 비트는 모두 무시하는 역할을 합니다.

반대로 픽셀을 재구성할 때는 ARGB 값을 각자의 위치만큼 왼쪽으로 시프트한 후, 비트 OR 연산으로 하나로 결합하면 됩니다.

// 새 RGB 값 설정
p = (a<<24) | (r<<16) | (g<<8) | b;
img.setRGB(x, y, p);