그림 6-37은 실제 영상에 대해 히스토그램 균등화를 수행한 후의 히스토그램 분포와 히스토그램 누적 함수의 모습을 보여준다. 히스토그램 분포는 검정색으로 표현하였고, 히스토그램 누적 함수는 회색의 실선으로 표현하였다. 그림 6-37(a)는 원본 영상인 lenna.bmp 파일에 대한 히스토그램과 누적 함수이다. 히스토그램이 중앙 부분에만 밀집해있기 때문에 누적 함수가 그레이스케일 중간 부분에서 최댓값까지 도달해 있음을 볼 수 있다. 그림 6-37(b)는 히스토그램 균등화가 적용된 결과 영상이다. 그림 6-37(b)에서 히스토그램의 누적 함수의 모양이 직선 형태로 반듯하게 증가하는 것을 볼 수 있다. 실제 디지털 영상의 경우, 히스토그램 균등화를 적용한 영상이라고 하더라도 히스토그램 자체가 균등하게 되지는 않지만, 누적 함수의 형태를 보면 그러한 속성을 가지고 있음을 확인할 수 있다.
그러면 이제 영상의 히스토그램 균등화를 수행하는 함수를 작성해보자. 함수의 이름은 IppHistogramEqualization을 사용하기로 하고, IppEnhance.h 파일에 다음과 같은 함수의 선언을 추가하자.
void IppHistogramEqualization(IppByteImage& img);
IppHistogramEqualization 함수의 정의는 소스 6-22에 나타내었다. 앞에서 적분으로 표현하였던 수식이 실제 구현에서는 단순히 누적합의 형태로 변경되었다. 소스 코드가 복잡하기 않기 때문에 코드에 대한 자세한 설명은 생략하기로 한다.
void IppHistogramEqualization(IppByteImage& img) { int size = img.GetSize(); BYTE* p = img.GetPixels(); // 히스토그램 계산 float hist[256]; IppHistogram(img, hist); // 히스토그램 누적 함수 계산 float cdf[256] = { 0.0, }; cdf[0] = hist[0]; for (int i = 1; i < 256; i++) cdf[i] = cdf[i - 1] + hist[i]; // 히스토그램 균등화 for (int i = 0; i < size; i++) { p[i] = static_cast<BYTE>(limit(cdf[p[i]] * 255)); } }