캐니 에지 검출기란?
캐니 에지 검출기(Canny Edge Detector)는 최적 검출기(optimal detector)로 널리 알려진 알고리즘입니다. 실제로 존재하는 에지만을 정확하게 검출하고, 하나의 에지에 대해 단 한 번의 응답만을 반환하며, 에지 픽셀과 검출된 픽셀 사이의 거리를 최소화하기 때문입니다.
Canny() 메서드 개요
OpenCV의 Imgproc 클래스가 제공하는 Canny() 메서드는 주어진 이미지에 캐니 에지 검출 알고리즘을 적용합니다. 이 메서드는 다음 인자들을 받습니다.
- 원본 이미지와 결과 이미지를 나타내는 두 개의 Mat 객체
- 임계값(threshold)을 저장하는 두 개의 double 변수
캐니 에지 검출 수행 절차
캐니 에지 검출기를 활용해 이미지의 윤곽선을 추출하려면 아래 순서대로 진행합니다.
- 이미지 불러오기 — Imgcodecs 클래스의 imread() 메서드로 원본 이미지를 읽어옵니다.
- 그레이스케일 변환 — Imgproc 클래스의 cvtColor() 메서드로 컬러 이미지를 회색조 이미지로 변환합니다.
- 블러 처리 — Imgproc 클래스의 blur() 메서드에 커널 크기 3을 지정하여 노이즈를 줄입니다.
- 에지 검출 — 블러가 적용된 이미지에 Canny() 메서드로 캐니 에지 검출 알고리즘을 적용합니다.
- 빈 행렬 생성 — 모든 값이 0으로 초기화된 행렬을 만듭니다.
- 결과 합성 — Mat 클래스의 copyTo() 메서드로 검출된 에지를 빈 행렬에 복사합니다.
예제 코드
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.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class EdgeDetection 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);
// 에지, 원본, 결과 이미지를 저장할 빈 행렬 생성
Mat gray = new Mat(src.rows(), src.cols(), src.type());
Mat edges = new Mat(src.rows(), src.cols(), src.type());
Mat dst = new Mat(src.rows(), src.cols(), src.type(), new Scalar(0));
// 이미지를 그레이스케일로 변환
Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGB2GRAY);
// 이미지에 블러 적용
Imgproc.blur(gray, edges, new Size(3, 3));
// 에지 검출 수행
Imgproc.Canny(edges, edges, 100, 100*3);
// 검출된 에지를 결과 행렬에 복사
src.copyTo(dst, edges);
// 행렬을 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("Canny Edge Detection Example");
stage.setScene(scene);
stage.show();
}
public static void main(String args[]) {
launch(args);
}
}
입력 이미지

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