더북(TheBook)

실제로 이와 같이 코드를 작성하여 실행한 결과를 그림 5-14에 나타냈습니다. 그림 5-14에서 src 창에 나타난 영상이 camera.bmp 카메라맨 영상입니다. 카메라맨 영상의 히스토그램에는 크게 두 개의 픽셀 값 분포가 두드러지게 나타나는 것을 볼 수 있습니다. srcHist 창에 나타난 히스토그램에서 A 영역은 주로 카메라맨이 입고 있는 외투 또는 머리카락 픽셀로부터 만들어진 어두운 픽셀 분포를 표현합니다. 상대적으로 밝은 회색을 표현하는 B 영역은 camera.bmp 영상에서 하늘 또는 잔디밭의 픽셀로부터 생성되었음을 가늠할 수 있습니다.

▲ 그림 5-14 영상의 히스토그램 분석

 

Note

C/C++ 문법을 이용하여 그레이스케일 영상의 히스토그램을 직접 구할 수도 있습니다. 일단 0으로 초기화된 256개 크기의 정수형 배열을 선언하고, 영상의 모든 픽셀을 스캔하면서 해당 픽셀 값에 해당하는 히스토그램 배열 값을 1씩 증가시키는 형태로 코드를 작성하면 됩니다. 예를 들어 그레이스케일 레나 영상에 대해 히스토그램을 구하는 C/C++ 코드는 다음과 같이 작성할 수 있습니다.

Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);
 
int hist[256] = { 0, };
for (int j = 0; j < src.rows; j++) {
  for (int i = 0; i < src.cols; i++) {
      hist[src.at<uchar>(j, i)]++;
  }
}

이 코드를 수행하면 hist 배열에 히스토그램 정보가 저장되고, 이 정보를 이용하여 히스토그램 그래프를 그리는 것도 가능합니다. 그러나 OpenCV에서 제공하는 히스토그램 관련 기능(예를 들어 히스토그램 역투영, 히스토그램 비교 등)을 사용하려면 히스토그램 정보가 Mat 객체 형태로 저장되어 있어야 합니다. 그러므로 calcHist() 함수를 사용하여 히스토그램 행렬을 만드는 방법을 잘 익혀 두는 것이 중요합니다.

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