您好,欢迎访问三七文档
广东工业大学《数字图像、数字信号处理及应用》实验报告题目直方图均衡院、系(部)自动化学院专业及班级学号姓名日期2017.5.211目录1实验目的....................................................................................................................22实验要求....................................................................................................................23实验设备....................................................................................................................24实验原理....................................................................................................................24.1、BMP(Bitmap-File)文件格式........................................................................24.2、直方图的概念和直方图均衡方法...............................................................45软件设计....................................................................................................................55.1总体设计.........................................................................................................55.2详细设计.........................................................................................................56测试与分析..............................................................................................................116.1、准备BMP文件..........................................................................................116.2、统计直方图.................................................................................................126.3、测试图片.....................................................................................................127结论与问题讨论......................................................................................................168参考文献..................................................................................................................1721实验目的理解直方图的概念和直方图均衡方法;熟悉BMP文件格式;基于C语言实现直方图均衡。2实验要求(1)理解直方图的概念、特点及应用;(2)熟悉BMP文件格式,能解析BMP文件中各部分数据;(3)完成以下设计实现:a.编写C语言函数,完成对输入图像的直方图均衡处理;b.编写C语言程序,完成对输入图像BMP文件的图像属性及像素数据的读取(灰度图像);c.编写C语言程序,对直方图均衡后的输出图像数据整理成BMP文件格式存储(灰度图像);d.利用MATLAB检验你所编写的直方图均衡函数的正确性。更多的改进方向:e.编写C语言函数,实现彩色图像的直方图均衡。3实验设备安装了VC、MATLAB软件的PC机4实验原理4.1、BMP(Bitmap-File)文件格式BMP采取位映射存储格式,除了图像可选之外,不采用其他任何压缩,因此,BMP文件所占空间很大。BMP的图像可选1Bit、4Bit、8Bit及24Bit。BMP文件存储数据的扫描方式是按从左到右、从下到上的顺序。BMP文件由文件头(Bitmap-fileheader)、位图信息头(Bitmap-informationheader)、彩色表(Colortable)和图形数据四部分组成,其中文件头、位图信息头、彩色表这三个部分的结构体已在《windows.h》中的《windgi.h》定义,不用我们自己定义。下面大概介绍这四个部分,介绍比较详细的是与我们实验比较密切的信息。3①文件头(Bitmap-fileheader)typedefstructtagBITMAPFILEHEADER{WORDbfType;//文件的类型,为“BM”DWORDbfSize;//整个文件的字节数,包括文件头、信息头、信息表WORDbfReserved1;//保留字,必须为0WORDbfReserved2;//保留字,必须为0DWORDbfOffBits;//图像数据的起始位置,以相对于文件头的偏移地址}BITMAPFILEHEADER②位图信息头(Bitmap-informationheader)typedefstructtagBITMAPINFOHEADER{DWORDbiSize;//BITMAPINFOHEADER结构所需要的字节数。LONGbiWidth;//位图宽度,以像素为单位。LONGbiHeight;//位图高度,以像素为单位。如值为正数,图像是倒向的WORDbiPlanes;//bmp图片的平面数,恒等于1。WORDbiBitCount;//比特数/象素,其值为1、4、8、16、24、或32。DWORDbiCompression;//图象数据压缩的类型。为0,不压缩DWORDbiSizeImage;//用字节数表示的位图数据的大小。包括每一行补的“0”的数目LONGbiXPelsPerMeter;//说明水平分辨率,用象素/米表示。LONGbiYPelsPerMeter;//说明垂直分辨率,用象素/米表示。DWORDbiClrUsed;//位图实际使用的彩色表中的颜色索引数DWORDbiClrImportant;//对图象显示有重要影响的颜色索引的数目}BITMAPINFOHEADER;③彩色图(Colortable)它用于说明位图中的颜色,有若干个表项,每一个表项是一个RGBQUAD类型的结构,表项的多少有信息头的biBitCount来确定。typedefstructtagPALETTEENTRY{BYTEpeRed;BYTEpeGreen;BYTEpeBlue;BYTEpeFlags;//透明度(也有说是保留的)}PALETTEENTRY;④图像数据4使用Photoshop、MATLAB存储图片时,Photoshop、MATLAB会对图片的总长度进行4字节对齐处理。多余部分以0填充,并将多余部分的字节数加到biSizeImage(位图数据的大小)中。4.2、直方图的概念和直方图均衡方法直方图均衡的实质是一种非线性灰度变换,即重新分配图像像素的灰度值,使各灰度级的像素数量大致相同。其目的是扩大像素灰度值的动态范围,进而增强图像整体对比度。直方图均衡化步骤:①统计位图中各个灰度出现的频数②由灰度值出现的频数计算出灰度值出现的频率③由灰度值出现的频率计算出均衡化之后的变换表④利用变化表对图像进行均衡化55软件设计5.1总体设计本实验中单一灰度直方图均衡化和彩色图像均衡化的大致流程图相同。因为只有一个主函数,下面给出主函数的流程图:开始打开源文件读取源文件的文件头、信息头,并进行显示遍历源文件的所有数据,统计所有灰度出现的频数建立灰度重新分布查找表输出文件利用灰度重新分布查找表重新编排数据结束图1(主函数流程图)5.2详细设计5.2.1整体代码设计6#includestdafx.h#includewindows.h//#includewingdi.h#includetime.h#defineHIST_WIDTH256//直方图的宽度int_tmain(intargc,_TCHAR*argv[]){BITMAPFILEHEADERbitHead;//bmp文件头BITMAPINFOHEADERbitInfoHead;//位图信息头DWORDNk[HIST_WIDTH]={0};//记录位图各个数据出现的频数,初始化为0BYTESk[HIST_WIDTH];//均衡化之后的灰度对应表DWORDrawData_length;//位图数据长度BYTE*fileBuf;//文件缓冲区DWORDbuf_len;//文件缓冲区字节数intread_length;FILE*bmpFileIn;//源文件指针FILE*bmpFileOut;//输出文件指针/*打开源文件*/if((bmpFileIn=fopen(in.bmp,rb))==NULL){printf(Can'topenfileforreading!);system(pause);return1;}/*读取文件头、信息头信息*/fread(&bitHead,sizeof(BYTE),sizeof(BITMAPFILEHEADER),bmpFileIn);fread(&bitInfoHead,sizeof(BYTE),sizeof(BITMAPINFOHEADER),bmpFileIn);/*位图数据的长度=长的像素长度*宽的像素长度*/rawData_length=bitInfoHead.biWidth*bitInfoHead.biHeight;/*bmp文件宽度的字节数必须是4的倍数,即4字节对齐。如果不是4的倍数,则需要取4的倍数,比如1266,则取1266+2=1268;为什么必须是4的倍数?这里涉及到一个行对齐的问题:由于Windows在进行行扫描的时候最小的单位为4个字节,所以当图片宽X每个像素的字节数!=4的整数倍时要在每行的后面补上缺少的字节,以0填充。所以,对于宽度不是4的整数倍的bmp文件需要对“0”出现的频数进行校正。*/buf_len=bitInfoHead.biWidth+(bitInfoHead.biWidth%4)?(4-(bitInfoHead.biWidth%4)):0;fileBuf=(BYTE*)malloc(sizeof(BYTE)*buf_len);/*遍历源文件的所有数据,统计所有灰度出现的频数*/fseek(bmpFileIn,bitHead.bfOffBits,SEEK_SET);//文件指针重定位for(inti=0;ibitInfoHead.biHeight;i++){read_length=fread(fileBuf,sizeof(BYTE),buf_len,bmpFileIn);7/*这里是ibitInfoHead.biWid
本文标题:直方图均衡图像处理
链接地址:https://www.777doc.com/doc-5493415 .html