이미지 속에 포함된 원을 검출하려면 허프 원 변환(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);
}
}코드 동작 순서 살펴보기
위 예제 코드는 다음 단계로 진행됩니다.
라이브러리 로딩:
System.loadLibrary()를 통해 OpenCV 네이티브 라이브러리를 불러옵니다.이미지 읽기:
Imgcodecs.imread()메서드로 지정된 경로의 이미지 파일을Mat객체로 읽어들입니다.그레이스케일 변환:
cvtColor()메서드와COLOR_RGBA2GRAY플래그를 사용해 컬러 이미지를 흑백 이미지로 변환합니다.노이즈 제거:
medianBlur()메서드로 미디언 필터링을 적용하여 노이즈를 줄입니다. 허프 변환은 노이즈에 민감하기 때문에 이 과정이 중요합니다.원 검출:
HoughCircles()메서드에HOUGH_GRADIENT방식, 해상도 비율(Math.PI/180, 즉 1라디안 단위), 최소 중심 거리(150픽셀)를 전달하여 원을 검출합니다.결과 시각화: 검출된 각 원의 중심 좌표(x, y)와 반지름(r) 값을 꺼내어 빨간색(
Scalar(0, 0, 255))으로 중심점과 외곽선을 이미지 위에 그립니다.화면 출력: 결과 이미지를 JavaFX의
WritableImage로 변환한 후ImageView에 담아 창에 표시합니다.
입력 이미지

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

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