C 图像直方图均衡化

C 图像直方图均衡化,c,image-processing,C,Image Processing,我有这个问题吗?如何在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

我有这个问题吗?如何在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直方图(无符号字符图像[64][64],无符号字符图像[64][64],无符号长历史[256],无符号长历史[256],浮点cdf[256]){
#定义第64行
#定义第64列
int i,j;
整数像素=行*列;
//原始直方图
对于(i=1;i<256;i++){
hist[i]=0;
}
对于(i=0;i
这是我的主要职能:

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);
}
void主管道(void){
文件*fp;
fp=fopen(“../lena_eye.raw”,“rb”);
int i,j;
对于(i=0;i<64;i++){
对于(j=0;j<64;j++){
[i][j]中的图像_=getc(fp);
}   
}
fclose(fp);
直方图(图像输入、图像输出、历史、eHist、cdf);
}
我收到的结果可以在图像中看到

[1] :-image_in
[2] :-Hist
[3] :-eHist

[4] :-image\u out

此代码位错误:

for (i = 1; i < 256; i++) {
    cdf[i] = 0;
    for (i = 1; i < 256; i++) {
        cdf[i] += hist[i];
    }
}
…但写出来会更简单:

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

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

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

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

inti,j;
常量无符号长像素=行*列;
无符号长cdf_min;
const unsigned char*limit=图像单位+像素;
无符号字符*img;
//原始直方图
对于(i=0;i<256;i++)
{
hist[i]=0;
}
用于(img=image_in;img

}感谢对课文的修改,我的英语不是很好。
 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++;
}