北工大数字图像处理bmp图像的直方图均衡实验.docx
《北工大数字图像处理bmp图像的直方图均衡实验.docx》由会员分享,可在线阅读,更多相关《北工大数字图像处理bmp图像的直方图均衡实验.docx(8页珍藏版)》请在冰豆网上搜索。
北工大数字图像处理bmp图像的直方图均衡实验
数字图像处理实验报告
11024118李锡蒙
实验要求:
1.打开bmp图像,打印图像基本参数,比如长、宽、像素数等。
2.给一幅图像,统计灰度直方图,进行一次直方图均衡操作,比较直方图均衡前后,直方图分布的变化。
实验原理:
位图数据的存储方式:
BMP图像文件被分成4个部分:
位图文件头(BitmapFileHeader)、位图信息头(BitmapInfoHeader)、颜色表(ColorMap)和位图数据(即图像数据,DataBits或DataBody)。
第1部分为位图文件头BITMAPFILEHEADER,是一个结构体类型,该结构的长度是固定的,为14个字节。
其定义如下:
typedefstructtagBITMAPFILEHEADER
{
WORDbfType;
DWORDbfSize;
WORDbfReserved1;
WORDbfReserved2;
DWORDbfOffBits;
}BITMAPFILEHEADER,FAR*LPBITMAPFILEHEADER,
*PBITMAPFILEHEADER;
第2部分为位图信息头BITMAPINFOHEADER,也是一个结构体类型的数据结构,该结构的长度也是固定的,为40个字节(WORD为无符号16位整数,DWORD为无符号32位整数,LONG为32位整数)。
其定义如下:
typedefstructtagBITMAPINFOHEADER
{
DWORDbiSize;
LONGbiWidth;
LONGbiHeight;
WORDbiPlanes;
WORDbiBitCount
DWORDbiCompression;
DWORDbiSizeImage;
LONGbiXPelsPerMeter;
LONGbiYPelsPerMeter;
DWORDbiClrUsed;
DWORDbiClrImportant;
}BITMAPINFOHEADER,FAR*LPBITMAPINFOHEADER,
*PBITMAPINFOHEADER;
第3部分为颜色表。
颜色表实际上是一个RGBQUAD结构的数组,数组的长度由biClrUsed指定(如果该值为零,则由biBitCount指定,即2的biBitCount次幂个元素)。
RGBQUAD结构是一个结构体类型,占4个字节,其定义如下:
typedefstructtagRGBQUAD
{
BYTErgbBlue;
BYTErgbGreen;
BYTErgbRed;
BYTErgbReserved;
}RGBQUAD;
第4部分是位图数据,即图像数据,其紧跟在位图文件头、位图信息头和颜色表(如果有颜色表的话)之后,记录了图像的每一个像素值。
BMP文件分为4个组成部分,那么BMP文件的读入也要按照4个组成部分依次进行处理,即先处理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);
fread(pBmpBuf,1,lineByte*bmpHeight,inputfile);
一定要按照位图文件头(BitmapFileHeader)、位图信息头(BitmapInfoHeader)、颜色表(ColorMap)和位图数据(即图像数据,DataBits或DataBody)的顺序进行读取,如上所示。
3.lineByte=(bmpWidth*biBitCount/8+3)/4*4;
计算图像每行像素所占的字节数,必须将其长度扩展为4的倍数,再进行图像数据的读取。
实验结果:
显示的信息包含如下几方面:
1.ImageType:
图像文件类型;图中显示为“BM”,表示该图像为BMP格式。
2.FileSize:
图像文件大小;图中显示为251078,与下图中图像属性中大小一致。
3.Width:
图像宽度;图中显示为500。
4.Height:
图像高度;图中显示为500。
5.BitCount:
每个像素所占的位数(bit);图中显示为8,表示图像为2^8=256色。
6.Compression:
压缩类型。
7.SizeImage:
图像数据实际占用的字节数。
直方图均衡化:
实现步骤:
1.统计各个灰度级的像素点数,即求得灰度直方图
2.归一化,用各灰度级的像素点数除以整个图像的像素数,得到0、1间的概率值
3.用累计求和法求转换后的灰度级,如求n级灰度均衡化后的新灰度级,需要把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,outputfile);
fwrite(pColorTable,sizeof(RGBQUAD),256,outputfile);fwrite(pBmpBuf,1,lineByte*bmpHeight,outputfile);
写文件的顺序与读一样。
4.除了第四部分位图数据中原来的灰度级变成了转换后的灰度级,其他三部分的数据是完全一致的,所以实验中我将待进行直方图均衡图像的位图文件头、位图信息头和颜色表信息读取出来后直接写入转换后的文件,再添加转换后位图数据即可。
5.直方图的实现:
实验中我用的是VC的控制台界面编写的程序,画图不是很方便,但是有一个很好用的字符printf("%c",219);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的直方图