더북(TheBook)

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차 편미분을 각각 구하여 dxdy 행렬에 저장합니다. dxdy 행렬은 float 자료형을 사용하도록 설정하였습니다.

15행 dxdy 행렬로부터 그래디언트 크기를 계산하여 fmag에 저장합니다. dxdy가 모두 float 자료형을 사용하므로 fmagfloat 자료형을 사용하는 행렬로 생성됩니다.

16행 실수형 행렬 fmag를 그레이스케일 형식으로 변환하여 mag에 저장합니다.

18행 에지 판별을 위한 그래디언트 크기 임계값을 150으로 설정하여 에지를 판별합니다. 행렬 edge의 원소 값은 mag 행렬 원소 값이 150보다 크면 255로, 작으면 0으로 설정됩니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.