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

Java 예제로 배우는 OpenCV 적응형 임계값(Adaptive Threshold) 완벽 가이드

적응형 임계값(Adaptive Thresholding)이란?

임계값 처리(Thresholding)는 이미지를 분할(segmentation)하는 간단하면서도 강력한 기법으로, 주로 이진(binary) 이미지를 생성하는 데 사용됩니다. 기본적인 임계값 처리에서는 지정된 임계값보다 큰 픽셀들이 표준 값으로 대체됩니다.

반면 적응형 임계값(Adaptive Thresholding)은 이미지 전체에 하나의 임계값을 적용하는 것이 아니라, 작은 영역별로 임계값을 계산하는 방식입니다. 따라서 조명 조건이 균일하지 않은 이미지에서도 영역마다 서로 다른 임계값이 적용되어 더 정확한 결과를 얻을 수 있습니다.

adaptiveThreshold() 메서드의 매개변수

OpenCV에서 adaptiveThreshold() 메서드는 주어진 이미지에 적응형 임계값 연산을 수행합니다. 이 메서드가 받는 매개변수는 다음과 같습니다.

  • 원본 이미지와 결과 이미지를 나타내는 두 개의 Mat 객체
  • 임계값 계산 시 사용되는 최대 값을 나타내는 정수 변수
  • 사용할 적응형 방식(ADAPTIVE_THRESH_MEAN_C 또는 ADAPTIVE_THRESH_GAUSSIAN_C)과 임계값 유형을 나타내는 두 개의 정수 변수
  • 임계값을 계산할 때 사용되는 픽셀 이웃(neighborhood)의 크기를 나타내는 정수 변수
  • 두 방식 모두에서 사용되는 상수를 나타내는 double 타입 변수

Java 예제 코드

다음은 JavaFX와 함께 OpenCV의 적응형 임계값을 적용하는 완전한 예제 코드입니다.

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 AdaptiveThreshold 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 객체 생성
        Mat dst = new Mat(src.rows(), src.cols(), src.type());
        // 적응형 임계값 적용
        Imgproc.adaptiveThreshold(src, dst, 125,
            Imgproc.ADAPTIVE_THRESH_MEAN_C,
            Imgproc.THRESH_BINARY, 11, 12);
        // Mat 객체를 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("Adaptive Threshold");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String args[]) {
        launch(args);
    }
}

입력 이미지

예제에서 사용된 입력 이미지는 다음과 같습니다.

Java 예제로 배우는 OpenCV 적응형 임계값(Adaptive Threshold) 완벽 가이드

실행 결과

위 프로그램을 실행하면 적응형 임계값이 적용된 결과 이미지가 아래와 같이 창에 표시됩니다.

Java 예제로 배우는 OpenCV 적응형 임계값(Adaptive Threshold) 완벽 가이드

정리

적응형 임계값 처리는 조명이 불균일한 이미지에서 특히 효과적입니다. 일반적인 임계값 처리(global thresholding)와 달리 영역별로 임계값을 동적으로 계산하기 때문에 문서 스캔, 문자 인식 전처리 등 다양한 컴퓨터 비전 작업에서 널리 활용됩니다. 위 예제처럼 Imgproc.adaptiveThreshold() 메서드를 사용하면 몇 줄의 코드만으로 손쉽게 구현할 수 있습니다.