더북(TheBook)

그림 6-37은 실제 영상에 대해 히스토그램 균등화를 수행한 후의 히스토그램 분포와 히스토그램 누적 함수의 모습을 보여준다. 히스토그램 분포는 검정색으로 표현하였고, 히스토그램 누적 함수는 회색의 실선으로 표현하였다. 그림 6-37(a)는 원본 영상인 lenna.bmp 파일에 대한 히스토그램과 누적 함수이다. 히스토그램이 중앙 부분에만 밀집해있기 때문에 누적 함수가 그레이스케일 중간 부분에서 최댓값까지 도달해 있음을 볼 수 있다. 그림 6-37(b)는 히스토그램 균등화가 적용된 결과 영상이다. 그림 6-37(b)에서 히스토그램의 누적 함수의 모양이 직선 형태로 반듯하게 증가하는 것을 볼 수 있다. 실제 디지털 영상의 경우, 히스토그램 균등화를 적용한 영상이라고 하더라도 히스토그램 자체가 균등하게 되지는 않지만, 누적 함수의 형태를 보면 그러한 속성을 가지고 있음을 확인할 수 있다.

그림 6-37 히스토그램 스트레칭과 균등화 결과 비교
(a) 입력 영상
(b) 히스토그램 균등화

그러면 이제 영상의 히스토그램 균등화를 수행하는 함수를 작성해보자. 함수의 이름은 IppHistogramEqualization을 사용하기로 하고, IppEnhance.h 파일에 다음과 같은 함수의 선언을 추가하자.

void IppHistogramEqualization(IppByteImage& img);

IppHistogramEqualization 함수의 정의는 소스 6-22에 나타내었다. 앞에서 적분으로 표현하였던 수식이 실제 구현에서는 단순히 누적합의 형태로 변경되었다. 소스 코드가 복잡하기 않기 때문에 코드에 대한 자세한 설명은 생략하기로 한다.

소스 6-22 히스토그램 균등화 함수(IppEnhance.cpp)
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));
    }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.