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

OpenCV 허프 원 변환(Hough Circle Transform)의 Java 구현 방법


이미지 속에 포함된 원을 검출하려면 허프 원 변환(Hough Circle Transform)을 활용할 수 있습니다. OpenCV에서는 HoughCircles() 메서드를 호출하여 이 변환을 간단하게 적용할 수 있으며, 이 메서드는 다음과 같은 매개변수를 받습니다.

  • 입력 이미지를 나타내는 Mat 객체

  • 검출된 원들의 벡터 정보를 저장할 출력용 Mat 객체

  • 검출 방식(detection method)을 지정하는 정수형 변수

  • 누산기(accumulator) 해상도와 이미지 해상도의 역비율(inverse ratio), 그리고 검출된 원들의 중심 사이 최소 거리를 나타내는 두 개의 double형 변수

예제 코드

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
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;
public class HoughCircleTransform extends Application {
    public void start(Stage stage) throws IOException {
        // OpenCV 핵심 라이브러리 로딩
        System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
        String file ="D:\\Images\\compass.jpg";
        Mat src = Imgcodecs.imread(file);
        // 이미지를 그레이스케일로 변환
        Mat gray = new Mat();
        Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGBA2GRAY);
        // 이미지 블러링 처리
        Mat blur = new Mat();
        Imgproc.medianBlur(gray, blur, 5);
        // 허프 원 변환으로 원 검출
        Mat circles = new Mat();
        Imgproc.HoughCircles(blur, circles, Imgproc.HOUGH_GRADIENT, Math.PI/180, 150);
        for (int i = 0; i < circles.cols(); i++ ) {
            double[] data = circles.get(0, i);
            Point center = new Point(Math.round(data[0]), Math.round(data[1]));
            // 원의 중심 표시
            Imgproc.circle(src, center, 1, new Scalar(0, 0, 255), 3, 8, 0 );
            // 원의 외곽선 그리기
            int radius = (int) Math.round(data[2]);
            Imgproc.circle(src, center, radius, new Scalar(0,0,255), 3, 8, 0 );
        }
        // 행렬을 JavaFX WritableImage로 변환
        Image img = HighGui.toBufferedImage(src);
        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("Hough Circle Transform");
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String args[]) {
        launch(args);
    }
}

코드 동작 순서 살펴보기

위 예제 코드는 다음 단계로 진행됩니다.

  1. 라이브러리 로딩: System.loadLibrary()를 통해 OpenCV 네이티브 라이브러리를 불러옵니다.

  2. 이미지 읽기: Imgcodecs.imread() 메서드로 지정된 경로의 이미지 파일을 Mat 객체로 읽어들입니다.

  3. 그레이스케일 변환: cvtColor() 메서드와 COLOR_RGBA2GRAY 플래그를 사용해 컬러 이미지를 흑백 이미지로 변환합니다.

  4. 노이즈 제거: medianBlur() 메서드로 미디언 필터링을 적용하여 노이즈를 줄입니다. 허프 변환은 노이즈에 민감하기 때문에 이 과정이 중요합니다.

  5. 원 검출: HoughCircles() 메서드에 HOUGH_GRADIENT 방식, 해상도 비율(Math.PI/180, 즉 1라디안 단위), 최소 중심 거리(150픽셀)를 전달하여 원을 검출합니다.

  6. 결과 시각화: 검출된 각 원의 중심 좌표(x, y)와 반지름(r) 값을 꺼내어 빨간색(Scalar(0, 0, 255))으로 중심점과 외곽선을 이미지 위에 그립니다.

  7. 화면 출력: 결과 이미지를 JavaFX의 WritableImage로 변환한 후 ImageView에 담아 창에 표시합니다.

입력 이미지

OpenCV 허프 원 변환(Hough Circle Transform)의 Java 구현 방법

실행 결과

위 코드를 실행하면 아래와 같은 출력 결과를 얻을 수 있습니다. 입력 이미지에서 검출된 원들이 빨간색 선으로 표시되는 것을 확인할 수 있습니다.

OpenCV 허프 원 변환(Hough Circle Transform)의 Java 구현 방법

마무리

허프 원 변환은 에지 검출 결과를 기반으로 누산 공간에서 원의 후보를 찾는 방식으로 동작합니다. 파라미터인 해상도 비율과 최소 중심 거리 값을 조절하면 검출 민감도를 튜닝할 수 있으므로, 실제 프로젝트에서는 이미지 특성에 맞게 이 값들을 실험적으로 조정하는 것이 좋습니다.