거리 변환(Distance Transform)이란?
거리 변환은 디지털 이미지의 파생 표현(derived representation) 기법 중 하나입니다. 이 연산에서는 전경(foreground) 영역 내부 픽셀들의 그레이 레벨 강도가, 해당 픽셀에서 가장 가까운 0 값(경계)까지의 거리 값으로 변경됩니다. 즉, 전경 영역 안의 각 픽셀이 경계로부터 얼마나 떨어져 있는지를 밝기 값으로 시각화할 수 있습니다.
OpenCV에서는 Imgproc 클래스의 distanceTransform() 메서드를 사용하여 주어진 이미지에 거리 변환을 적용합니다. 이 메서드는 다음과 같은 매개변수를 받습니다.
- 원본 이미지와 결과 이미지를 나타내는 두 개의 Mat 객체
- 적용할 거리 변환 유형을 나타내는 정수 변수 (예: Imgproc.DIST_C)
- 사용할 마스크 크기를 나타내는 정수 값
Java 예제 코드
아래 예제는 이미지를 읽어 그레이스케일로 변환한 뒤, 이진화(threshold) 처리를 거쳐 거리 변환을 적용하고, 그 결과를 JavaFX 윈도우에 출력하는 전체 과정을 보여줍니다.
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 DistanceTransform extends Application {
public void start(Stage stage) throws IOException {
// OpenCV 핵심 네이티브 라이브러리 로드
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 파일에서 이미지를 읽어 그레이스케일로 Matrix 객체에 저장
String file = "D://images//boy.jpg";
Mat src = Imgcodecs.imread(file, Imgcodecs.IMREAD_GRAYSCALE);
// 결과를 저장할 빈 Matrix 객체 생성
Mat dst = new Mat();
Mat binary = new Mat();
// 그레이스케일 이미지를 이진 이미지로 변환
Imgproc.threshold(src, binary, 100, 255, Imgproc.THRESH_BINARY);
// 거리 변환 적용
Imgproc.distanceTransform(binary, dst, Imgproc.DIST_C, 3);
Core.convertScaleAbs(dst, dst);
// Matrix를 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("Distance Transform");
stage.setScene(scene);
stage.show();
}
public static void main(String args[]) {
launch(args);
}
}코드 핵심 흐름 정리
- 라이브러리 로드 — System.loadLibrary()로 OpenCV 네이티브 라이브러리를 불러옵니다.
- 이미지 읽기 — Imgcodecs.imread()로 이미지를 그레이스케일 모드(IMREAD_GRAYSCALE)로 읽어들입니다.
- 이진화 — Imgproc.threshold()를 사용해 임계값 100을 기준으로 이미지를 이진 이미지로 변환합니다. 거리 변환은 일반적으로 이진 이미지에 적용할 때 가장 효과적입니다.
- 거리 변환 적용 — Imgproc.distanceTransform()에 DIST_C 거리 유형과 마스크 크기 3을 지정하여 변환을 수행합니다.
- 결과 출력 — Core.convertScaleAbs()로 절대값 스케일링 후, HighGui와 SwingFXUtils를 통해 JavaFX 화면에 렌더링합니다.
입력 이미지

실행 결과
위 프로그램을 실행하면 다음과 같은 결과 창이 생성됩니다. 전경 영역의 중심부일수록 밝게 표현되어, 경계로부터의 거리 정보가 밝기 차이로 시각화된 것을 확인할 수 있습니다.
