1、北工大数字图像处理bmp图像的直方图均衡实验数字图像处理实验报告11024118 李锡蒙实验要求:1. 打开bmp图像,打印图像基本参数,比如长、宽、像素数等。2. 给一幅图像,统计灰度直方图,进行一次直方图均衡操作,比较直方图均衡前后,直方图分布的变化。实验原理:位图数据的存储方式:BMP图像文件被分成4个部分:位图文件头(Bitmap File Header)、位图信息头(Bitmap Info Header)、颜色表(Color Map)和位图数据(即图像数据,Data Bits或Data Body)。第1部分为位图文件头BITMAPFILEHEADER,是一个结构体类型,该结构的长度是
2、固定的,为14个字节。其定义如下: typedef struct tagBITMAPFILEHEADERWORD bfType;DWORD bfSize;WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;第2部分为位图信息头BITMAPINFOHEADER,也是一个结构体类型的数据结构,该结构的长度也是固定的,为40个字节(WORD为无符号16位整数,DWORD为无符号32位整数,LONG为32位整数)。其定义如下:
3、 typedef struct tagBITMAPINFOHEADERDWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCountDWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed;DWORD biClrImportant; BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;第3部分为颜色表
4、。颜色表实际上是一个RGBQUAD结构的数组,数组的长度由biClrUsed指定(如果该值为零,则由biBitCount指定,即2的biBitCount次幂个元素)。RGBQUAD结构是一个结构体类型,占4个字节,其定义如下:typedef struct tagRGBQUADBYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed;BYTE rgbReserved;RGBQUAD;第4部分是位图数据,即图像数据,其紧跟在位图文件头、位图信息头和颜色表(如果有颜色表的话)之后,记录了图像的每一个像素值。BMP文件分为4个组成部分,那么BMP文件的读入也要按照4个组成部分依次进
5、行处理,即先处理BITMAPFILEHEADER结构,然后是BITMAPINFOHEADER结构、颜色表,最后是位图数据。实验1遇到的问题和难点:1. 其中若想调用上图中出现的WORD、DWORD、LONG等数据类型,需要在程序开始时加#include Windows.h即可。2. fread(&fileheader,sizeof(BITMAPFILEHEADER),1,inputfile);fread(&head,sizeof(BITMAPINFOHEADER),1,inputfile);fread(pColorTable,sizeof(RGBQUAD),256,inputfile);fre
6、ad(pBmpBuf,1,lineByte * bmpHeight,inputfile);一定要按照位图文件头(Bitmap File Header)、位图信息头(Bitmap Info Header)、颜色表(Color Map)和位图数据(即图像数据,Data Bits或Data Body)的顺序进行读取,如上所示。3. lineByte=(bmpWidth * biBitCount/8+3)/4*4;计算图像每行像素所占的字节数,必须将其长度扩展为4的倍数,再进行图像数据的读取。实验结果: 显示的信息包含如下几方面:1. ImageType:图像文件类型;图中显示为“BM”,表示该图像为
7、BMP格式。2. FileSize:图像文件大小;图中显示为251078,与下图中图像属性中大小一致。3. Width:图像宽度;图中显示为500。4. Height:图像高度;图中显示为500。5. BitCount:每个像素所占的位数(bit);图中显示为8,表示图像为28=256色。6. Compression:压缩类型。7. SizeImage:图像数据实际占用的字节数。直方图均衡化:实现步骤:1. 统计各个灰度级的像素点数,即求得灰度直方图2. 归一化,用各灰度级的像素点数除以整个图像的像素数,得到0、1间的概率值3. 用累计求和法求转换后的灰度级,如求n级灰度均衡化后的新灰度级,需
8、要把0到n级的概率累加起来,计算所得到的值与哪个灰度级更靠近,该灰度级即为转换后的灰度级4. 进行灰度级转换实验2遇到的难点和问题:1. 用累加求和算出的值与灰度级贴近,如计算值在0/255和1/255之间,通过比较该值与(0+1)/(255*2)的大小可知与0/255和1/255哪个更为靠近,大于时与1/255更接近,否则为0/255,。这个操作是必要的,这样比较后得出的转换灰度值才更准确的。2. fwrite(&fileheader,sizeof(BITMAPFILEHEADER),1,outputfile);fwrite(&head,sizeof(BITMAPINFOHEADER),1,
9、outputfile); fwrite(pColorTable,sizeof(RGBQUAD),256,outputfile); fwrite(pBmpBuf,1,lineByte * bmpHeight,outputfile);写文件的顺序与读一样。4. 除了第四部分位图数据中原来的灰度级变成了转换后的灰度级,其他三部分的数据是完全一致的,所以实验中我将待进行直方图均衡图像的位图文件头、位图信息头和颜色表信息读取出来后直接写入转换后的文件,再添加转换后位图数据即可。5. 直方图的实现:实验中我用的是VC的控制台界面编写的程序,画图不是很方便,但是有一个很好用的字符printf(%c,219)
10、;ASCII为219号的字符为一个实心的黑方块,可以用来画直方图,但是由于控制台的显示大小有限,我将直方图的长、宽都减小了,所以会丢失一些灰度级的数据,但是大体直方图的特征还是能表现的很好的,尤其是直方图均衡化前后直方图的分布明显不同,可以满足观察转换结果的目的。实验结果:1. 当灰度值分布在高灰度值时的情况(即曝光时间较长),如下图图2,图像偏亮。图2 图2的直方图图2的灰度直方图显示的情况与分析的结果相同,灰度级只分布在直方图的高灰度值部分,无低灰度值成分,导致图像亮度偏高。图filter-2上图filter-2为图2进行直方图均衡后重新生成的图像,可直观感觉到低灰度值(暗)的成分明显增多,图像灰度成分更加丰富。图filter-2的直方图分析:从filter-2的灰度直方图可以看出,灰度值遍布在整个0到255的灰度级区间上,且各灰度级的概率相对于均衡化前的差异变小,达到了直方图均衡化的效果。2. 当灰度值分布在低灰度值时的情况(即曝光时间较短),如下图图3,图像偏暗。 图3 图filter-3图3的直方图图filter-3的直方图
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1