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

OpenCV Java로 구현하는 캐니(Canny) 에지 검출 완벽 가이드


캐니 에지 검출기란?

캐니 에지 검출기(Canny Edge Detector)는 최적 검출기(optimal detector)로 널리 알려진 알고리즘입니다. 실제로 존재하는 에지만을 정확하게 검출하고, 하나의 에지에 대해 단 한 번의 응답만을 반환하며, 에지 픽셀과 검출된 픽셀 사이의 거리를 최소화하기 때문입니다.

Canny() 메서드 개요

OpenCV의 Imgproc 클래스가 제공하는 Canny() 메서드는 주어진 이미지에 캐니 에지 검출 알고리즘을 적용합니다. 이 메서드는 다음 인자들을 받습니다.

  • 원본 이미지와 결과 이미지를 나타내는 두 개의 Mat 객체
  • 임계값(threshold)을 저장하는 두 개의 double 변수

캐니 에지 검출 수행 절차

캐니 에지 검출기를 활용해 이미지의 윤곽선을 추출하려면 아래 순서대로 진행합니다.

  1. 이미지 불러오기 — Imgcodecs 클래스의 imread() 메서드로 원본 이미지를 읽어옵니다.
  2. 그레이스케일 변환 — Imgproc 클래스의 cvtColor() 메서드로 컬러 이미지를 회색조 이미지로 변환합니다.
  3. 블러 처리 — Imgproc 클래스의 blur() 메서드에 커널 크기 3을 지정하여 노이즈를 줄입니다.
  4. 에지 검출 — 블러가 적용된 이미지에 Canny() 메서드로 캐니 에지 검출 알고리즘을 적용합니다.
  5. 빈 행렬 생성 — 모든 값이 0으로 초기화된 행렬을 만듭니다.
  6. 결과 합성 — 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);
    }
}

입력 이미지

OpenCV Java로 구현하는 캐니(Canny) 에지 검출 완벽 가이드

출력 결과

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

OpenCV Java로 구현하는 캐니(Canny) 에지 검출 완벽 가이드