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

Java로 두 이미지 비교하는 방법: 픽셀 RGB 값 차이로 유사도 계산하기

Java에서 두 이미지가 얼마나 유사한지 확인하려면 각 픽셀의 RGB 값을 하나씩 대조하는 방법을 사용할 수 있습니다. 별도의 외부 라이브러리 없이 JDK에 기본 포함된 ImageIOBufferedImage 클래스만으로도 손쉽게 구현할 수 있습니다.

이미지 비교 절차

  • ImageIO.read() 메서드를 사용하여 두 이미지를 모두 읽어 들입니다.
  • 두 이미지의 너비와 높이를 가져와 서로 동일한지 확인합니다.
  • 각 픽셀 값을 읽어 두 이미지의 RGB 값을 구합니다.
  • 두 이미지의 RGB 값 차이를 모두 더합니다.
  • 다음 공식을 사용하여 차이의 백분율(%)을 계산합니다.
Average = difference / (width * height * 3);
Percentage = (Average / 255) * 100;

예제 코드

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

public class ComparingImages {
    public static void main(String[] args) throws Exception {
        BufferedImage img1 = ImageIO.read(new File("D:\\Images\\test1.jpg"));
        BufferedImage img2 = ImageIO.read(new File("D:\\Images\\test2.jpg"));

        int w1 = img1.getWidth();
        int w2 = img2.getWidth();
        int h1 = img1.getHeight();
        int h2 = img2.getHeight();

        if ((w1 != w2) || (h1 != h2)) {
            System.out.println("두 이미지의 크기가 동일해야 합니다.");
        } else {
            long diff = 0;
            for (int j = 0; j < h1; j++) {
                for (int i = 0; i < w1; i++) {
                    // 첫 번째 이미지 픽셀의 RGB 값 가져오기
                    int pixel1 = img1.getRGB(i, j);
                    Color color1 = new Color(pixel1, true);
                    int r1 = color1.getRed();
                    int g1 = color1.getGreen();
                    int b1 = color1.getBlue();

                    // 두 번째 이미지 픽셀의 RGB 값 가져오기
                    int pixel2 = img2.getRGB(i, j);
                    Color color2 = new Color(pixel2, true);
                    int r2 = color2.getRed();
                    int g2 = color2.getGreen();
                    int b2 = color2.getBlue();

                    // 두 이미지의 RGB 값 차이의 합 계산
                    long data = Math.abs(r1 - r2) + Math.abs(g1 - g2) + Math.abs(b1 - b2);
                    diff = diff + data;
                }
            }
            double avg = diff / ((double) w1 * h1 * 3);
            double percentage = (avg / 255) * 100;
            System.out.println("Difference: " + percentage);
        }
    }
}

입력 이미지 1

Java로 두 이미지 비교하는 방법: 픽셀 RGB 값 차이로 유사도 계산하기

입력 이미지 2

Java로 두 이미지 비교하는 방법: 픽셀 RGB 값 차이로 유사도 계산하기

실행 결과

Difference: 92.54901960784314

결과값은 0~100 사이의 백분율로 표현됩니다. 0에 가까울수록 두 이미지가 거의 동일하다는 뜻이며, 값이 클수록 차이가 큽니다. 위 예제에서는 약 92.55%의 차이가 계산되었으므로 두 이미지가 상당히 다르다고 해석할 수 있습니다.

참고로 이 방식은 모든 픽셀을 순회하기 때문에 고해상도 이미지에서는 처리 시간이 오래 걸릴 수 있습니다. 더 정교한 비교가 필요하다면 OpenCV의 템플릿 매칭, 히스토그램 비교, SSIM(구조적 유사도) 같은 알고리즘을 활용하는 것이 좋습니다.