에지 감지(Edge Detection)에 사용되는 소벨(Sobel) 연산자는 주어진 이미지에서 수평 방향과 수직 방향의 에지를 모두 찾아낼 수 있도록 해주는 대표적인 이미지 처리 기법입니다. 소벨 연산자는 이미지에 가우시안 스무딩과 미분을 동시에 적용하는 방식으로 동작하여, 노이즈의 영향을 줄이면서도 경계선을 효과적으로 검출합니다.
Sobel() 메서드의 매개변수
OpenCV에서 Imgproc 클래스가 제공하는 Sobel() 메서드는 주어진 이미지에 소벨 에지 감지 알고리즘을 적용합니다. 이 메서드는 다음과 같은 매개변수를 받습니다.
src, dst — 원본(소스) 이미지와 결과(대상) 이미지를 나타내는 두 개의 Mat 객체
ddepth — 결과 이미지의 깊이(depth)를 나타내는 정수 변수 (-1을 지정하면 원본 이미지와 동일한 깊이가 사용됨)
dx, dy — 각각 x축과 y축 방향의 도함수 차수를 나타내는 두 개의 double 변수
dx와 dy 조합에 따라 검출되는 에지의 방향이 달라집니다. dx:1, dy:0은 수직 에지를, dx:0, dy:1은 수평 에지를 강조하며, 두 값을 모두 1로 설정하면 양방향 에지가 함께 검출됩니다.
예제 코드
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 SobelEdgeDetection {
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();
// 소벨 미분 적용 (dx:0, dy:1)
Imgproc.Sobel(src, dst, -1, 0, 1);
HighGui.imshow("Sobel - x:0 & y:1", dst);
HighGui.waitKey();
// 소벨 미분 적용 (dx:1, dy:0)
Imgproc.Sobel(src, dst, -1, 1, 0);
HighGui.imshow("Sobel - x:1 & y:0", dst);
HighGui.waitKey();
// 소벨 미분 적용 (dx:1, dy:1)
Imgproc.Sobel(src, dst, -1, 1, 1);
HighGui.imshow("Sobel - x:1 & y:1", dst);
HighGui.waitKey();
}
}
실행 결과
위 프로그램을 실행하면 매개변수 조합별로 다음과 같은 결과 창이 순차적으로 표시됩니다.
x:0 & y:1 (수평 방향 에지)

x:1 & y:0 (수직 방향 에지)

x:1 & y:1 (양방향 에지)

결과 이미지에서 확인할 수 있듯이, dx와 dy 값의 조합을 변경하면 같은 원본 이미지라도 서로 다른 방향의 에지가 강조되어 나타납니다. 실제 프로젝트에서는 목적에 맞는 조합을 선택하거나, 여러 결과를 결합해 더 완전한 에지 맵을 얻을 수 있습니다.