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

입력 이미지 2

실행 결과
Difference: 92.54901960784314
결과값은 0~100 사이의 백분율로 표현됩니다. 0에 가까울수록 두 이미지가 거의 동일하다는 뜻이며, 값이 클수록 차이가 큽니다. 위 예제에서는 약 92.55%의 차이가 계산되었으므로 두 이미지가 상당히 다르다고 해석할 수 있습니다.
참고로 이 방식은 모든 픽셀을 순회하기 때문에 고해상도 이미지에서는 처리 시간이 오래 걸릴 수 있습니다. 더 정교한 비교가 필요하다면 OpenCV의 템플릿 매칭, 히스토그램 비교, SSIM(구조적 유사도) 같은 알고리즘을 활용하는 것이 좋습니다.