에지 검출(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();
}
}
입력 이미지

출력 결과
위 프로그램을 실행하면 각각의 미분 방향에 따라 다음과 같은 두 개의 창이 표시됩니다.
Scharr - x:0 & y:1(수직 방향 에지 검출 결과)
Scharr - x:1 & y:0(수평 방향 에지 검출 결과)
정리
이처럼 Imgproc.Scharr() 메서드의 dx와 dy 값을 조절하면 원하는 방향의 에지만 손쉽게 추출할 수 있습니다. 두 방향의 결과를 결합하면 이미지 내 모든 에지를 효과적으로 검출할 수 있으며, 이는 객체 인식, 윤곽선 분석 등 다양한 컴퓨터 비전 작업의 기초가 됩니다.