Histogram equalization(HE)은 주어진 이미지의 픽셀분포가 모든 픽셀값에서 같은 확률로 나타나도록 픽셀값의 변경시켜서 이미지를 보다 잘 인식되도록하는 처리과정이다. 그리고, 이러한 균일한 분포는 또한 엔트로피의 관점에서 살펴볼 때 최대의 엔트로피값을 주는 분포이기도 하다. 그러나, HE는 원본이미지의 밝기를 유지하지 않는다. 따라서, 보다 현실적으로 원본이미지의 밝기를 유지하면서, 엔트로피를 최대화시키는 히스토그램 분포를 찾아서, 그것으로 변환을 시도하는 것이 방법을 고려해 볼 수 있다. 그러한 목표 히스토그램을 f(s) (연속적인 확률밀도함수로 생각함)라고 하면,

히스토그램일 조건 ;  

밝기 보존: 

이러한 제한조건에서 아래의 최대 엔트로피 조건을 만족시켜야 한다.

위의 조건를 만족시키는 f(s)는 lagrange-multiplier를 이용하고, 변분방법을 쓰면 쉽게 구해진다.

그리고 λ는 

의 근이다. 오르쪽은 λ에 대해서 단조증가함수이므로 근은 유일하게 하나가 존재한다.
원본이미지에서 픽셀의 평균값을 계산하고, 위의 방정식에 넣어서 λ를 구하면, 목표로하는 히스토그램을 얻을 수 있으면, 이것의 cumulative 히스토그램과, 원본이미지의 cumulative히스토그램을 구해서, 그 차이를 최소로하는 픽셀값의 대응관계를 찾으면 된다(histogram specification).

참고: Bright Preserving Histogram Equalization with Maximum Entropy: A Variational Perspective.
        C. Wang and Z.Ye, IEEE Trans. Consumer Electronics. V51. No4. (2005);

// BPHEME의 cumulative histogram(continuous version)::integral of f(s) over s;

double cdf(double s, double mu, double lambda) {

// histogram specification;1==>2
void hist_spec(double chist1[],  //source cumulative histogram;
                      double chist2[], // target cumulative histogram;
                      int n,                 //=256;
                      int lut[])             // resultant mapping(1->2); {

//

void BPHEME(BYTE* src, int width, int height, BYTE *dst) {
    double hist[256], hist2[256];           //src(dst) histogram;

    double chist[256], chist2[256];        //src(dst) cumulative histogram;
    int lut[256];                                //histogram specification mapping;

    int n = width * height;
    make_hist(src, width, height, hist);

    normalize_hist(hist, 256);

    //cumulative histogram;

    make_cumulative_hist0(hist, 256, chist);
    TRACE("chist[255]=%f\n", chist[255]);
    // gray-mean;

    double mu = hist_mean(hist, 256);
    TRACE("mean=%f(%d)\n", mu, int(mu * 255+.5));
    // determin lambda;
    double lambda, th=1.e-15;
    FindRoot(mu, th, lambda);
    TRACE("lambda=%f\n", lambda);
    // entropy of src;

    double entropy1 = hist_entropy(hist, 256)

     // dst-cumulative

    for (i = 0; i < 256; i++) chist2[i] = cdf(double(i)/255., mu, lambda);
    TRACE("chist2[255]=%f\n", chist2[255]);

    // histogram-specification;
    hist_spec(&chist[0], &chist2[0], 256, &lut[0]);

    // make dist image;
    for (i=0; i<n; i++) dst[i] = lut[src[i]];

    // make histogram of dst;

    make_hist(dst, width, height, hist2);

    // normalize hist2;

    normalize_hist(hist2, 256);

    // mean of dst;

    double mu2 = hist_mean(hist2, 256);
    TRACE("new mean=%f(%d)\n", mu2, int(mu2 + .5));

    // entropy of dst;

    double entropy2 = hist_entropy(hist2, 256);
    TRACE("total entropy(before, after)= (%f, %f)\n", entropy1, entropy2);
};


// Root finding procedure ::
// define F(s, mu);
double F(double s, double mu) {

//derivative of F(s, mu) w.r.t. s;
double DF(double s, double mu) {   

// Find root of F(s,mu) based on Newton-Raphson method.
int FindRoot(double mu, double threshold, double& s) {

사용자 삽입 이미지

histogram equaliztion 결과;

사용자 삽입 이미지


BPHEME  결과:

사용자 삽입 이미지

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

Fast Median Filter 3x3  (0) 2009.11.27
Fant's Resampling  (0) 2008.12.17
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
Posted by helloktk