#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)//关闭文件