您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > BMP图片的直方图均衡化文档
直方图均衡化文档一、BMP文件结构解析1.BMP文件组成BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。2.BMP文件头(14字节)BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。////////////////////////类型定义///////////////////////////////typedefunsignedlongDWORD;typedefintBOOL;typedefunsignedcharBYTE;typedefunsignedshortWORD;typedeffloatFLOAT;////////////////////////////////////////////////////////////////////其结构定义如下:typedefstructtagBITMAPFILEHEADER{WORDbfType;///位图文件的类型BMP为0X4d42,也就是字母m和bDWORDbfSize;//位图文件的大小,以字节为单位(3-6字节)WORDbfReserved1;//位图文件保留字,必须为0(7-8字节)WORDbfReserved2;//位图文件保留字,必须为0(9-10字节)DWORDbfOffBits;//位图数据的起始位置,以相对于位图(11-14字节)//文件头的偏移量表示,以字节为单位}BITMAPFILEHEADER;3.位图信息头位图信息头包含了单个像素所用字节数以及描述颜色的格式,此外还包括位图的宽度、高度、目标设备的位平面数、图像的压缩格式。以下是位图信息头结构的定义:BMP位图信息头数据用于说明位图的尺寸等信息。typedefstructtagBITMAPINFOHEADER{DWORDbiSize;//本结构所占用字节数(15-18字节),,常为28HLONGbiWidth;//位图的宽度,以像素为单位(19-22字节)LONGbiHeight;//位图的高度,以像素为单位(23-26字节)WORDbiPlanes;//目标设备的级别,必须为1(27-28字节)WORDbiBitCount;//每个像素所需的位数,必须是1(双色),(29-30字节)//4(16色),8(256色)16(高彩色)或24(真彩色)之一DWORDbiCompression;//位图压缩类型,必须是0(不压缩),(31-34字节)//1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一DWORDbiSizeImage;//位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位(35-38字节)LONGbiXPelsPerMeter;//位图水平分辨率,每米像素数(39-42字节)LONGbiYPelsPerMeter;//位图垂直分辨率,每米像素数(43-46字节)DWORDbiClrUsed;//位图实际使用的颜色表中的颜色数(47-50字节)DWORDbiClrImportant;//位图显示过程中重要的颜色数(51-54字节)}BITMAPINFOHEADER;4.颜色表颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:typedefstructtagRGBQUAD{BYTErgbBlue;//蓝色的亮度(值范围为0-255)BYTErgbGreen;//绿色的亮度(值范围为0-255)BYTErgbRed;//红色的亮度(值范围为0-255)BYTErgbReserved;//保留,必须为0}RGBQUAD;颜色表中RGBQUAD结构数据的个数有biBitCount来确定:当biBitCount=1,4,8时,分别有2,16,256个表项;当biBitCount=24时,没有颜色表项。5.位图数据位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:当biBitCount=1时,8个像素占1个字节;当biBitCount=4时,2个像素占1个字节;当biBitCount=8时,1个像素占1个字节;当biBitCount=24时,1个像素占3个字节,按顺序分别为B,G,R;Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。二、读取BMP图片以及直方图均衡化处理1.头文件#ifndefHIST_EQU_COLOR_H#defineHIST_EQU_COLOR_Htypedefstruct{//unsignedshortbfType;//由于源文件中需要类型判断,所以单独读取unsignedlongbfSize;unsignedshortbfReserved1;unsignedshortbfReserved2;unsignedlongbfOffBits;}ClBitMapFileHeader;typedefstruct{unsignedlongbiSize;longbiWidth;longbiHeight;unsignedshortbiPlanes;unsignedshortbiBitCount;unsignedlongbiCompression;unsignedlongbiSizeImage;longbiXPelsPerMeter;longbiYPelsPerMeter;unsignedlongbiClrUsed;unsignedlongbiClrImportant;}ClBitMapInfoHeader;typedefstruct{unsignedcharrgbBlue;unsignedcharrgbGreen;unsignedcharrgbRed;unsignedcharrgbReserved;}ClRgbQuad;//这个类用来保存图片的基本数据typedefstruct{intwidth;intheight;intchannels;unsignedchar*imageData;//图片像素数据}ClImage;ClImage*clLoadImage(char*path);boolclSaveImage(char*path,ClImage*bmpImg);voidfree_bmp(ClImage*img);unsignedchar*Handle_bmp(unsignedchar*bitmap,intnr_pixels);#endif2.源文件////////////////////////读取BMP源图片//////////////////ClImage*clLoadImage(char*path){ClImage*bmpImg;FILE*pFile;unsignedshortfileType;ClBitMapFileHeaderbmpFileHeader;ClBitMapInfoHeaderbmpInfoHeader;intchannels=1;intwidth=0;intheight=0;intstep=0;intoffset=0;unsignedcharpixVal;ClRgbQuad*quad;inti,j,k=0;bmpImg=(ClImage*)malloc(sizeof(ClImage));pFile=fopen(path,rb);if(!pFile){free(bmpImg);returnNULL;}fread(&fileType,sizeof(unsignedshort),1,pFile);//单独读取文件类型,所以在头文件中为定义if(fileType==0x4D42)//==bm{printf(Havereadthebmpfile!\n);fread(&bmpFileHeader,sizeof(ClBitMapFileHeader),1,pFile);printf(bmpFileHeader:\n);printf(bfSize:%d\n,bmpFileHeader.bfSize);printf(bfReserved1:%d\n,bmpFileHeader.bfReserved1);printf(bfReserved2:%d\n,bmpFileHeader.bfReserved2);printf(bfOffBits:%d\n,bmpFileHeader.bfOffBits);fread(&bmpInfoHeader,sizeof(ClBitMapInfoHeader),1,pFile);printf(bmpInfoHeader:\n);printf(biSize:%d\n,bmpInfoHeader.biSize);printf(Imagesize:%dx%d\n,bmpInfoHeader.biWidth,bmpInfoHeader.biHeight);printf(biPlanes:%d\n,bmpInfoHeader.biPlanes);printf(biBitCount:%d\n,bmpInfoHeader.biBitCount);printf(biCompression:%d\n,bmpInfoHeader.biCompression);printf(biSizeImage:%dbytes\n,bmpInfoHeader.biSizeImage);printf(biXPelsPerMeter:%d\n,bmpInfoHeader.biXPelsPerMeter);printf(biYPelsPerMeter:%d\n,bmpInfoHeader.biYPelsPerMeter);printf(biClrUsed:%d\n,bmpInfoHeader.biClrUsed);printf(biClrImportant:%d\n,bmpInfoHeader.biClrImportant);printf(-----------------------------------);if(bmpInfoHeader.biBitCount==8){printf(\nthispictureisgray!\n\n);//ClImagechannels=1;width=bmpInfoHeader.biWidth;height=bmpInfoHeader.biHeight;offset=(channels*width)%4;if(offset!=0){offset=4-offset;}bmpImg-width=width;bmpImg-height=height;bmpImg-channels=1;bmpImg-imageData=(unsignedchar*)malloc(sizeof(unsignedchar)*width*height);step=channels*width;quad=(ClRgbQuad*)malloc(sizeof(ClRgbQuad)*256);fread(quad,sizeof(ClRgbQuad),256,pFile);free(quad);for(i=0;iheight;i++){for(j=0;jwidth;j++){fread(&pixVal,sizeof(unsignedchar),1,pFile);bmpImg-imageData[(height-1-i)*step+j]=pixVal;}if(offset!=0){for(j=0;joffset;j++){fread(&pixVal,sizeof(unsignedchar),1,pFile);}}}}}returnbmpImg;}////////////////直方图均衡化处理函数////////////////unsignedchar*Handle_bmp(unsignedchar*bitmap,intnr_pixels){intcount[256],acum[256];unsignedchar
本文标题:BMP图片的直方图均衡化文档
链接地址:https://www.777doc.com/doc-6322841 .html