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

OpenCV를 활용한 Java Scharr 에지 검출 예제 완벽 가이드

에지 검출(edge detection)을 위한 Scharr 연산자는 주어진 이미지에서 수평 방향과 수직 방향의 에지를 모두 찾아낼 수 있는 강력한 필터입니다. Scharr 연산자는 Sobel 연산자의 개선된 형태로, 특히 작은 커널 크기에서 회전 대칭성과 정확도가 더 뛰어난 것으로 알려져 있습니다.

Scharr() 메서드의 매개변수

OpenCV의 Imgproc 클래스가 제공하는 Scharr() 메서드는 입력 이미지에 Scharr 에지 검출 알고리즘을 적용합니다. 이 메서드는 다음과 같은 매개변수를 받습니다.

  • 원본 이미지와 결과 이미지를 나타내는 두 개의 Mat 객체
  • 결과 이미지의 깊이(depth)를 나타내는 정수 변수
  • x 방향과 y 방향의 미분 차수(dx, dy)를 지정하는 두 개의 double 변수

예제 코드

다음은 Java에서 OpenCV의 Scharr 연산자를 사용하여 이미지의 에지를 검출하는 전체 예제입니다.

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 ScharrEdgeDetection {
    public static void main(String args[]) {
        //OpenCV 코어 라이브러리 로드
        System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
        String file ="D:\\Images\\win2.jpg";
        Mat src = Imgcodecs.imread(file);
        //결과 이미지를 담을 빈 행렬 생성
        Mat dst = new Mat();
        //x:0, y:1 값으로 Scharr 미분 적용 (수직 방향)
        Imgproc.Scharr(src, dst, Imgproc.CV_SCHARR, 0, 1);
        HighGui.imshow("Scharr - x:0 & y:1 ", dst);
        //x:1, y:0 값으로 Scharr 미분 적용 (수평 방향)
        Imgproc.Scharr(src, dst, Imgproc.CV_SCHARR, 1, 0);
        HighGui.imshow("Scharr - x:1 & y:0 ", dst);
        HighGui.waitKey();
    }
}

입력 이미지

OpenCV를 활용한 Java Scharr 에지 검출 예제 완벽 가이드

출력 결과

위 프로그램을 실행하면 각각의 미분 방향에 따라 다음과 같은 두 개의 창이 표시됩니다.

Scharr - x:0 & y:1(수직 방향 에지 검출 결과)
OpenCV를 활용한 Java Scharr 에지 검출 예제 완벽 가이드

Scharr - x:1 & y:0(수평 방향 에지 검출 결과)
OpenCV를 활용한 Java Scharr 에지 검출 예제 완벽 가이드

정리

이처럼 Imgproc.Scharr() 메서드의 dx와 dy 값을 조절하면 원하는 방향의 에지만 손쉽게 추출할 수 있습니다. 두 방향의 결과를 결합하면 이미지 내 모든 에지를 효과적으로 검출할 수 있으며, 이는 객체 인식, 윤곽선 분석 등 다양한 컴퓨터 비전 작업의 기초가 됩니다.