【问题标题】:Histogram equalization on image图像直方图均衡化
【发布时间】:2018-06-28 22:32:59
【问题描述】:

我有这个问题?如何在C中对图像进行直方图均衡?我写了这段代码,但我没有得到正确的结果。

void histogram(unsigned char image_in [64][64],unsigned char image_out [64][64], unsigned long hist[256],unsigned long eHist[256],float cdf[256]) {
    #define lines 64
    #define columns 64

    int i,j;

    int pixels = lines*columns;

    // original histogram

    for (i = 1; i < 256; i++) {
        hist[i]=0;
    }

    for (i = 0; i < lines; i++) {
        for (j = 0; j < columns; j++) {
              hist[image_in[i][j]]++;
        }
    }

    // Cumulative Distribution Function
    float cdfmax=256, cdfmin=1;

    for (i = 1; i < 256; i++) {
        cdf[i] = 0;
        for (i = 1; i < 256; i++) {
            cdf[i] += hist[i];
        }
    }

    // Equalized Histogram

    for (i = 1; i < 256; i++) {
        eHist[i] = ((cdf[i]-cdfmin)/((lines*columns)-cdfmin))*255;
    }

    // Final Image

    for (i = 0; i < lines; i++) {
    for (j = 0; j < columns; j++) {
        image_out[i][j] = cdf[image_in[i][j]]*255;
    }
}
}   

这是我的主要功能:

void main(void) {
    FILE *fp;
    fp = fopen("../lena_eye.raw","rb");
    int i,j;
    for (i = 0; i < 64; i++) {
        for (j = 0; j < 64; j++) {
            image_in[i][j] = getc(fp);
        }   
    }

    fclose(fp);
    histogram(image_in, image_out, hist, eHist,cdf);
}

我收到的结果可以在图片中看到。

[1]:https://i.stack.imgur.com/zjhp9.png -image_in
[2]:https://i.stack.imgur.com/itDNE.png-Hist
[3]:https://i.stack.imgur.com/74Ulm.png-eHist
[4]:https://i.stack.imgur.com/qFwUw.png-image_out

【问题讨论】:

  • Т感谢对文字的修改,我的英文不是很好。

标签: c image-processing


【解决方案1】:

这段代码是错误的:

for (i = 1; i < 256; i++) {
    cdf[i] = 0;
    for (i = 1; i < 256; i++) {
        cdf[i] += hist[i];
    }
}

内循环改变了i 的值,弄乱了外循环。你想写的是这样的:

for (i = 0; i < 256; i++) {
    cdf[i] = 0;
    for (j = 0; j <= i; j++) {
        cdf[i] += hist[j];
    }
}

...但写起来会更简单:

cdf[0] = hist[0];
for (i = i; i < 256; i++) {
    cdf[i] = cdf[i-1] + hist[i];
}

此外,当您计算直方图和均衡直方图时,循环从 1 开始,它们应该从 0 开始。

【讨论】:

    【解决方案2】:

    我在代码中发现了我的错误,我分享了我写的内容。

     void Histogramm(unsigned char *image_in, unsigned char *image_out)
    

    {

    int i, j;
    const unsigned long pixels = lines * columns;       
    unsigned long cdf_min;
    const unsigned char* limit = image_in + pixels;     
    unsigned char* img;     
    //    original histogram
    
    for (i = 0; i < 256; i++)
    {
        hist[i] = 0;
    }
    
    
    for (img = image_in; img < limit; img++)
    {
        hist[*img]++;
    }
    
    //    Cumulative Distribution Function
    
    unsigned long count = 0;
    for (i = 0; i < 256; i++)
    {
        count += hist[i];
        cdf[i] = count;
    }
    for (i = 0; i < 256; i++)
    {
        if (cdf[i] != 0)
        {
            cdf_min = cdf[i];
            break;
        }
    }
    //                  Equalized Histogram
    
    //eHist[i]=round((cdf[i]-cdf_min)/(pixels-cdf_min)*255)=round(k*(cdf[i]-cdf_min))
    const double k = 255.0 / (pixels - cdf_min);
    
    for (i = 0; i < 256; i++)
    {
        eHist[i] = (unsigned long)(k*(cdf[i] - cdf_min));
    }
    
    //      Final Image
    
    for (img = image_in; img < limit; img++)    
    {
        *image_out = eHist[*img];
        image_out++;
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2020-01-27
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 2020-02-11
      • 2013-01-25
      • 1970-01-01
      相关资源
      最近更新 更多