영상에는 보통 우리가 관심이 있는 물체와 배경을 동시에 담고 있다. 그런데 어떤 경우에는 전체영상의 픽셀값의 다이나믹 레인지가 매우 좁아서, 달리 이야기하면 영상의 히스토그램을 살펴볼 때, 픽셀값의 분포가 매우 좁은 영역에 한정이 되어있는 경우에 물체와 배경이 잘 구별이 안되는 영상을 접하게 된다. 이러한 영상의 경우에 몇가지 영상처리방법을 동원하여서 좋은 콘트라스트를 갖는 영상을 만들 수 있다.

Histogram Equalization은 이러한 기법중의 하나이다. 이것은 좁은 영역에 분포하는 픽셀의 그레이 값을 가능한 모든 그레이 값의 범위에 골고루 분포하도록 재배치하여서 영상의 constrast 를 증대시키는 방법이다. Histogram Equalization에서 사용하는 그레이 값의 mapping은 출력영상의 픽셀 값은 모든 그레이레벨의 값을 다 가져야 한다는 것과, 각각의 그레이 레벨에 해당하는 픽셀의 수가 거의 일정하여야 한다(픽셀 값이 이산적이기 때문에 완벽하게 상수가 될 수 없다)는 조건에서 결정이 된다.



입력영상에서 그레이 값이 k 인 픽셀은 출력영상에서 어떤 그레이 값을 가져야 할까? 조건에 따르면 입력영상의 k 그레이레벨이 출력영상의 j 그레이 레벨로 매핑이 된다면, 출력영상에서는 부터 까지의 그레이레벨에 해당하는 픽셀의 수는 모든 그레이 레벨에서 픽셀분포가 균일하다는 조건 때문에 

로 주어진다. 이 값과 입력영상에서 부터 까지의 그레이 레벨을 갖는 픽셀의 수가 같으면 된다.


부터 k 까지의 그레이 값을 갖는 입력영상의 픽셀의 수는 


또, 총 픽셀 수는 cumulative histogram[255]로 주어진다. 따라서,  원하는 매핑 j = T[k]



이 매핑에 의하면 입력영상의 픽셀이 가지는 가장 큰 그레이 값은 출력영상에는 255에 해당하게 된다. 출력영상은 정의에 의해서 cumulative histogram이 직선적으로 증가하는 형태를 가지게 된다. 

큰 영상의 경우에 이 매핑을 Lookup 테이블로 저장하여서 연산의 횟수를 줄일 수 있다.


note)
1. 0차 cumulative histogram을 이용하면 0 부터 k 까지의 histogram의 합은 한 번의 호출로 얻어진다.
2. 0차 cumulative histogram의 마지막 bin의 값은 전체 픽셀수의 합이 된다.


// histogram의 합은 cumulative histogram을 구성하면 된다;

void HistogramEqualize(BYTE *src, int width, int height, BYTE* dst)

{

    int histogram[256], cumhist[256];

    memset(histogram, 0, sizeof(histogram)) ;

    for (int y = 0, k = 0; y < height; y++){

        for (int x = 0; x < width; x++, k++){

            histogram[src[k]]++ ;

       }

    }

    // make 0-st order cumulative histogram;

    cumhist[0] = histogram[0];

    for (int i = 1; i < 256; i++){

        cumhist[i] = cumhist[i-1] + histogram[i] ;

    };


    // make output;

    // cumhist[255] = number of pixels;

    double v = 255.0/cumhist[255];

    for (y = 0, k = 0; y < height; y++){

        for (int x = 0; x < width; x++, k++){
            int  a = int(v * cumhist[src[k]]);

            dst[k] = a < 0 ? 0 : a > 255 ? 255 : a;  //clamp to [0,255] 

        }

    }

};


사용자 삽입 이미지


평탄화 전의 히스토그램(붉은색) 밎 누적히스토그램(연두색)


사용자 삽입 이미지



평탄화 후의 히스토그램(붉은색) 밎 누적히스토그램(연두색)

'Image Recognition > Fundamental' 카테고리의 다른 글

Bright Preserving Histogram Equalization with Maximum Entropy  (0) 2008.07.31
Adaptive Binarization  (1) 2008.07.14
Histogram Equalization  (0) 2008.06.22
FFT2D  (0) 2008.06.10
Otsu Algorithm  (6) 2008.05.30
Hough Transform  (2) 2008.05.22
Posted by helloktk