이미지의 히스토그램(histogram)은 픽셀 강도(intensity) 값의 빈도 분포를 시각적으로 보여주는 그래프입니다. 이미지 히스토그램에서 X축은 회색조(그레이 레벨) 강도 값을 나타내고, Y축은 해당 강도 값이 나타나는 빈도를 나타냅니다. 히스토그램을 분석하고 조정하면 이미지의 명암 대비(contrast)를 효과적으로 개선할 수 있습니다.
히스토그램 균등화(Equalization)는 픽셀 강도 값의 분포를 전체 범위에 걸쳐 고르게 재분배하는 기법으로, 어둡거나 밝은 부분에 치우친 이미지의 대비를 크게 향상시킵니다.
OpenCV의 Imgproc 클래스가 제공하는 equalizeHist() 메서드는 원본 이미지와 결과 이미지를 담을 두 개의 Mat 객체를 인자로 받습니다. 이 메서드는 소스 행렬의 히스토그램을 균등화한 후, 그 결과를 목적지(destination) 행렬에 저장합니다.
예제 코드
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class HistogramEquilization extends Application {
public void start(Stage stage) throws IOException {
// OpenCV 핵심 네이티브 라이브러리 로딩
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
String file ="D:\\Images\\win2.jpg";
// 이미지를 그레이스케일로 읽어오기
Mat src = Imgcodecs.imread(file, Imgcodecs.IMREAD_GRAYSCALE);
// 결과 이미지를 저장할 빈 행렬 생성
Mat dst = new Mat(src.rows(), src.cols(), src.type());
// 히스토그램 균등화 수행
Imgproc.equalizeHist(src, dst);
// 행렬을 JavaFX WritableImage로 변환
Image img = HighGui.toBufferedImage(dst);
WritableImage writableImage= SwingFXUtils.toFXImage((BufferedImage) img, null);
// ImageView 설정
ImageView imageView = new ImageView(writableImage);
imageView.setX(10);
imageView.setY(10);
imageView.setFitWidth(575);
imageView.setPreserveRatio(true);
// Scene 객체 설정 및 화면 출력
Group root = new Group(imageView);
Scene scene = new Scene(root, 595, 400);
stage.setTitle("Histogram Equilization Example");
stage.setScene(scene);
stage.show();
}
public static void main(String args[]) {
launch(args);
}
}
입력 이미지

실행 결과
위 코드를 실행하면 다음과 같은 결과 화면을 확인할 수 있습니다.

결과 이미지를 보면 원본보다 명암 대비가 뚜렷하게 향상된 것을 알 수 있습니다. 히스토그램 균등화는 저대비 이미지의 시각적 품질을 개선하는 간단하면서도 강력한 방법으로, 사전 처리 단계에서 널리 활용됩니다.