IppEdgeCanny 함수는 크게 네 개의 구역으로 나눌 수 있으며, 각각의 구역은 번호를 매긴 주석으로 구분할 수 있도록 하였다. 먼저 “1. 가우시안 필터링” 부분의 코드를 살펴보자.
IppFloatImage imgGaussian(w, h); IppFilterGaussian(imgSrc, imgGaussian, sigma);
가우시안 필터링 부분은 매우 직관적이다. 여기서 사용된 IppFilterGaussian 함수는 이 책의 8장에서 설명한 가우시안 필터 구현 함수이다. 즉, 입력 영상 imgSrc를 표준 편차 sigma를 이용하여 가우시안 필터링을 수행하고, 그 결과는 imgGaussian에 저장된다. imgGaussian은 잡음의 영향이 감쇠된 영상이며, 이후 캐니 엣지 검출 알고리즘은 imgGaussian 영상에서 엣지를 찾는다. 이 부분에서 관심을 가져야 하는 사항은 imgGaussian 영상이 float 타입의 영상이라는 점이다. 캐니 엣지 검출기 구현 함수에서는 정밀한 연산을 위하여 내부적으로 실수형 데이터 타입을 사용한다.
다음으로 “2. 그래디언트 구하기 (크기 & 방향)” 구역에 대해 살펴보자. 여기서는 세 개의 float 타입 영상 imgGx, imgGy, imgMag 영상을 생성하여 사용한다. imgGx 영상에는 수평 방향의 소벨 마스크 연산을 수행한 결과를 저장하고, imgGy 영상에는 수직 방향의 소벨 마스크 연산 결과를 저장한다. imgMag 영상은 그래디언트 크기를 저장하기 위한 용도로 사용된다.
“3. 비최대 억제” 구역에서는 국지적 최대를 검출하고 엣지 픽셀 후보를 선정하는 작업이 수행된다. 이러한 작업은 전체 픽셀들 중에서 그래디언트 크기가 작은 임계값인 th_low보다 큰 픽셀들에 대해서만 수행된다.
if (pMag[j][i] > th_low) { // 그래디언트 크기가 th_low보다 큰 픽셀에 대해서만 국지적 최대 검사 // 국지적 최대인 픽셀에 대해서만 강한 엣지 또는 약한 엣지로 설정 }
즉, 이와 같은 if 문에 들어오는 픽셀들에 대해서만 그래디언트 방향을 계산하고, 그래디언트 방향 정보를 고려하여 국지적 최대인지 아닌지를 검사한다. 현재 검사하고 있는 픽셀이 국지적 최대를 만족한다면 local_max 지역 변수의 값은 true로 설정된다. 만약 국지적 최대로 선택된 픽셀의 그래디언트 크기가 높은 임계값 th_high보다 크다면, 이 픽셀은 강한 엣지로 설정하고 강한 엣지 목록 strong_edges에 추가한다. strong_edges는 STL의 vector를 사용하여 정의되었고, IppPoint 타입을 저장할 수 있다.