用C语言编写灰度图像直方图变换增强

Python09

用C语言编写灰度图像直方图变换增强,第1张

参考一下这个程序:

#define IMAGEWIDTH 80

#define IMAGEHEIGHT 80

void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto[256])

void Enhance(unsigned char *pImage,unsigned char *pImage1,int nWidth,int nHeight,float fHisto[256],float fHisto1[256])

unsigned char dbImage[IMAGEWIDTH*IMAGEHEIGHT]

unsigned char dbTargetImage[IMAGEWIDTH*IMAGEHEIGHT]

float fHistogram[256],fHistogram1[256]

unsigned char lut[256]

/* 直方图统计程序 */

int main()

{

... //准备一幅灰度图片到dbImage

Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram)//做直方图统计

Enhance(dbImage,dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram,fHistogram1)//直方图增强输出到dbTargetImage

...//完成后显示

}

void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto[256])

{

int i,j

unsigned int uWork

unsigned char *pWork

for ( i=0i<256i++ )fHisto[i]=0.0f

pWork=pImage

for ( i=0i<nHeighti++ )

{

for ( j=0j<nWidthj++,pWork++ )

{

uWork=(unsigned int)(*pWork)

fHisto[uWork]++

}

}

uWork=nWidth*nHeight

for ( i=0i<256i++ )

{

fHisto[i]/=uWork

fHisto[i]*=100

}

}

void Enhance(unsigned char *pImage,unsigned char *pImage1,int nWidth,int nHeight,float fHisto[256],float fHisto1[256])

{

int i,j

unsigned int uWork

unsigned char *pWork,*pWork1

for ( i=0i<256i++ )

fHisto1[i]=fHisto[i]/100

for ( i=1i<256i++ )

fHisto1[i]+=fHisto1[i-1]

for ( i=0i<256i++ )

lut[i]=fHisto1[i]*256

for ( i=0i<256i++ )

if ( lut[i]>=256 )

lut[i]=255

pWork=pImagepWork1=pImage1

for ( i=0i<nHeighti++ )

for ( j=0j<nWidthj++,pWork++,pWork1++ )

(*pWork1)=lut[(*pWork)]

}

1、步骤大概这样

第一步:读取图像数据到内存

第二步:读取文件

第三步:读取信息头

第四步:读取图像矩阵到二维数组

2、例程:

FileName=fileDlg.GetFileName ()

FILE *fp=fopen(FileName,"rb")//二进制读方式打开指定的图像文件

fread(&FileHead, sizeof(BITMAPFILEHEADER), 1,fp) //读取文件头,文件指针自动后移

fread(&InfoHead, sizeof(BITMAPINFOHEADER), 1,fp)//读取信息头,文件指针自动后移

//获取图像宽、高、每像素所占位数等信息

bmpWidth = InfoHead.biWidth

bmpHeight = InfoHead.biHeight

//下面完成图像数据向内存数组的存储

ImageData=new unsigned char*[bmpHeight]

if(InfoHead.biBitCount==24)

{

for (int i=0i<bmpHeighti++)

{

ImageData[i]=new unsigned char[(bmpWidth*3+3)/4*4]

}

for (int k=0k<bmpHeightk++ )

{

for(int j=0j<(bmpWidth*3+3)/4*4j++)

{

fread(&ImageData[k][j],1,1,fp)//上面完成动态二维数组的申请,这里实际读取图像数据

}

}

fclose(fp)//关闭文件