Sobel() 함수를 사용하여 실제 영상으로부터 그래디언트를 계산하고, 그래디언트 크기를 이용하여 에지를 검출하는 예제 코드를 코드 9-1에 나타냈습니다. 코드 9-1에 나타난 sobel_edge() 함수는 레나 영상에 대해 x축 방향과 y축 방향의 1차 미분을 구하고, 그래디언트 크기가 특정 임계값보다 큰 픽셀을 에지로 검출합니다. sobel_edge() 함수가 정의된 소스 파일은 내려받은 예제 파일 중 ch09/edges 프로젝트에서 확인할 수 있습니다.
코드 9-1 소벨 마스크 기반 에지 검출 예제 [ch09/edges]
01 void sobel_edge() 02 { 03 Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE); 04 05 if (src.empty()) { 06 cerr << "Image load failed!" << endl; 07 return; 08 } 09 10 Mat dx, dy; 11 Sobel(src, dx, CV_32FC1, 1, 0); 12 Sobel(src, dy, CV_32FC1, 0, 1); 13 14 Mat fmag, mag; 15 magnitude(dx, dy, fmag); 16 fmag.convertTo(mag, CV_8UC1); 17 18 Mat edge = mag > 150; 19 20 imshow("src", src); 21 imshow("mag", mag); 22 imshow("edge", edge); 23 24 waitKey(); 25 destroyAllWindows(); 26 }
• 10~12행 x축 방향으로 1차 편미분, y축 방향으로 1차 편미분을 각각 구하여 dx와 dy 행렬에 저장합니다. dx와 dy 행렬은 float 자료형을 사용하도록 설정하였습니다.
• 15행 dx와 dy 행렬로부터 그래디언트 크기를 계산하여 fmag에 저장합니다. dx와 dy가 모두 float 자료형을 사용하므로 fmag도 float 자료형을 사용하는 행렬로 생성됩니다.
• 16행 실수형 행렬 fmag를 그레이스케일 형식으로 변환하여 mag에 저장합니다.
• 18행 에지 판별을 위한 그래디언트 크기 임계값을 150으로 설정하여 에지를 판별합니다. 행렬 edge의 원소 값은 mag 행렬 원소 값이 150보다 크면 255로, 작으면 0으로 설정됩니다.