코드 5-7 그레이스케일 영상의 히스토그램 구하기 [ch05/histogram]
01 Mat calcGrayHist(const Mat& img) 02 { 03 CV_Assert(img.type() = = CV_8UC1); 04 05 Mat hist; 06 int channels[] = { 0 }; 07 int dims = 1; 08 const int histSize[] = { 256 }; 09 float graylevel[] = { 0, 256 }; 10 const float* ranges[] = { graylevel }; 11 12 calcHist(&img, 1, channels, noArray(), hist, dims, histSize, ranges); 13 14 return hist; 15 }
• 3행 CV_Assert() 매크로 함수를 이용하여 calcGrayHist() 함수로 전달된 img 영상이 그레이스케일 영상인지를 검사합니다. 만약 img 영상이 그레이스케일 영상이 아니면 에러가 발생하며 프로그램이 종료합니다.
• 5~10행 12행에서 호출하는 calcHist() 함수에 전달할 인자를 생성하는 구문입니다.
• 5행 히스토그램 정보를 저장할 Mat 타입의 변수 hist를 선언합니다.
• 6행 히스토그램을 구할 채널 번호를 담은 channels 배열을 생성합니다. 그레이스케일 영상은 한 개의 채널을 가지고 있고, 채널 번호는 0부터 시작하므로 channels 배열은 0 하나만 원소로 가집니다.
• 7행 dims 변수에 1을 대입한 것은 하나의 채널에 대해서만 히스토그램을 구하기 때문이며, 결과로 구해지는 hist 행렬이 1차원 행렬임을 나타냅니다.
• 8행 histSize 배열 원소에 256을 하나 지정한다는 것은 입력 영상의 첫 번째 채널 값의 범위를 256개 빈으로 나누어 히스토그램을 구하겠다는 의미입니다.
• 9~10행 graylevel 배열의 원소에는 그레이스케일 값의 최솟값과 최댓값인 0과 256을 차례대로 지정합니다. ranges 배열은 graylevel 배열 이름을 원소로 갖는 배열입니다.
• 12행 calcHist() 함수를 이용하여 img 영상의 히스토그램을 구하고, 그 결과를 hist 변수에 저장합니다.
• 14행 구해진 히스토그램 hist를 반환합니다.