您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 数字图像处理文档-直方图均衡&灰度线性变换&灰度拉伸
技术报告摘要:本文档为数字图像处理程序的技术报告。程序主要功能为读入8位或24位位图,并可选择性对其进行直方图均衡、灰度线性变换、灰度拉伸等操作。该文档从算法原理和算法实现两方面,通过对算法的文字表述、函数的功能介绍以及主要代码分析注释,阐述了该程序进行图像处理时的方法,并通过实验测试和分析实验结果,验证了程序的正确性和可靠性。关键词:直方图均衡灰度线性变换灰度拉伸1、任务说明打开一幅图像,进行直方图均衡。将灰度线性变化,将灰度拉伸。用C语言或JAVA编程序读出图像文件,并利用算法进行灰度拉伸。2、算法原理(背景意义,基本算法,扩展算法)2.1直方图均衡直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法。设图像均衡化处理后,图像的直方图是平直的,即各灰度级具有相同的出现频数,那么由于灰度级具有均匀的概率分布,图像看起来就更清晰了。在离散情况下,共有L个灰度级,其中第k个灰度级rk出现的像素个数为nk,图像的总像素个数为N,则第k个灰度级出现的概率为:(),进行均匀化处理的变换函数为:sT[]∑(j)j=0∑jj=0T−1[s]2.2灰度线性变换灰度的线性变换就是将图像中所有的点按照线性灰度变换函数进行变换。该线性灰度变换函数f(x)是一个一维线性函数:f(x)=fA*x+fB灰度变换方程为:D2=f(D1)=k*D+d式中参数k为线性函数的斜率,d为线性函数的在y轴上的截距,D1为输入图像的灰度,D2为输出的图像灰度。当k1时,输出的图像的对比度增大,图像的像素值在变换后全部增大,整体显示效果增强;当0k1时,输出图像的对比度和整体效果都将削弱;当k0时,原图像较量的区域变暗,较暗的区域则变亮,当k=-1,d=255时,输出图像的灰度正好反转;当k=1且d!=0时,操作仅仅使所有像素的灰度值上移或下移,其效果是使整个图像更亮或更暗;当k=1,d=0时,输出图像和输入图像相同。2.3灰度拉伸灰度拉伸又叫对比度拉伸,它是最基本的一种灰度变换,使用的是最简单的分段线性变换函数,它的主要思想是提高图像处理时灰度级的动态范围。可以有选择的拉伸某段灰度区间以改善输出图像。如图,所示的变换函数的运算结果是将原图在a到b之间的灰度拉伸到c到d之间。如果一幅图像的灰度集中在较暗的区域而导致图像偏暗,可以用灰度拉伸功能来拉伸(斜率1)物体灰度区间以改善图像;同样如果图像灰度集中在较亮的区域而导致图像偏亮,也可以用灰度拉伸功能来压缩(斜率1)物体灰度区间以改善图像质量。图2.1灰度拉伸3、算法实现3.1使用语言C++3.2编译环境VC++6.03.3数据结构3.3.1文件头typedefstructtagBITMAPFILEHEADER{WORDbfType;DWORDbfSize;WORDbfReserved1;WORDbfReserved2;DWORDbfOffBits;}BITMAPFILEHEADER,*PBITMAPFILEHEADER;bfType代表的是文件格式,所以,从BMP文件的前两个字节我们就可以判断我们要打开的图片是不是位图。bfSize代表的是该位图文件的大小(包含文件头、信息头、调色板(如果有)、像素数据)。它是一个DWORD类型,占4个字节。bfReserved1和bfReserved2都是保留量,因此它们应该都为0。它们合起来占4个字节bfOffBits代表的是像素数据距的偏移地址。如果我们想直接读像素数据的话,可以把文件指针偏移bfOffBits个字节,然后读取就可以了。在保存BMP文件的时候,保存的顺序也是按照bfType、bfSize、bfReserved1、bfReserved2、bfOffBits的顺序的。3.3.2信息头typedefstructtagBITMAPINFOHEADER{DWORDbiSize;LONGbiWidth;LONGbiHeight;WORDbiPlanes;WORDbiBitCount;DWORDbiCompression;DWORDbiSizeImage;LONGbiXPelsPerMeter;LONGbiYPelsPerMeter;DWORDbiClrUsed;DWORDbiClrImportant;}BITMAPINFOHEADER,*PBITMAPINFOHEADER;biSize代表的是该结构体的大小,即40字节。biWidth代表的是位图的宽度,以像素为单位。biHeight代表的是位图的高度,以像素为单位。biPlanes代表的位图的平面数。biBitCount代表的是位图的位数。biCompression代表是位图的压缩方法,由于BMP位图是没有压缩的,所以通常情况下它的值都为0。biSizeImage代表的是位图像素数据的大小,就是高度乘上每行像素所占的字节数。biXPelsPerMeter代表的是水平方向的分辨率,以米为单位。biYPelsPerMeter代表的是垂直方向的分辨率,以米为单位。biClrUsed代表的是位图用到的颜色数,可以设置为0,表示全部用到了。biClrImportant代表的是位图中重要的颜色数,可以设置为0,表示全部都很重要。3.3.3调色板typedefstructtagRGBQUAD{BYTErgbBlue;BYTErgbGreen;BYTErgbRed;BYTErgbReserved;}RGBQUAD只有8位位图具有调色板。调色板是有若干项(最多256项)构成的,而每一项都是一个RGBQUAD的结构体,也就是说每一项都有一个蓝色、绿色、红色和保留量。3.4函数说明3.4.1自定义函数说明函数功能说明输入参数说明输出参数说明voidPrintMenu()打印菜单选项intCheckFilePath(char*filepath)检查路径是否合法:文件能打开;以bmp为后缀名filepath:预处理位图路径路径合法返回0,否则返回-1voidShowImage(char*filepath)显示位图filepath:预处理位图路径voidReadFileHeader(char*filepath,BITMAPFILEHEADER*bmfh)读入位图的文件头filepath:预处理位图路径;bmfh:位图文件头指针voidReadInfoHeader(char*filepath,BITMAPINFO读入位图的信息头filepath:预处理位图路径;bmih:位图信息头指HEADER*bmih)针voidReadPixelData(char*filepath,BYTE*imgData)读入位图的像素数据filepath:预处理位图路径;imgData:像素数据指针intCreatePalette(RGBQUADpal[])创建8位位图的调色板pal:调色板指针创建成功返回0,否则返回-1LONGGetLineBytes(intimgWidth,intbitCount)计算每行像素所占的字节数imgWidth:位图宽度;bitCount:位图位数返回每行像素所占字节数intGrayEqualize(BYTE*image,DWORDdwWidth,DWORDdwHeight,WORDwBitCount)直方图均衡image:位图像素数据指针;dwWidth:位图宽度;dwHeight:位图高度;wBitCount:位图位数处理成功返回0,否则返回-1intLineTranslation(BYTE*image,DWORDdwWidth,DWORDdwHeight,WORDwBitCount,doublek,doubled)线性灰度变换image:位图像素数据指针;dwWidth:位图宽度;dwHeight:位图高度;wBitCount:位数;k:线性变换斜率;d:线性变换截距处理成功返回0,否则返回-1intGrayStretch(BYTE*image,DWORDdwWidth,DWORDdwHeight,WORDwBitCount,intpt1x,int灰度拉伸image:位图像素数据指针;dwWidth:位图宽度;dwHeight:位图高度;wBitCount:位数;处理成功返回0,否则返回-1pt1y,intpt2x,intpt2y)pt1x,pt1y,pt2x,pt2y:两个参考点的坐标voidPrintFileHeader(BITMAPFILEHEADER*bmfh)打印位图的文件头bmfh:文件头指针voidPrintInfoHeader(BITMAPINFOHEADER*bmih)打印位图的信息头bmih:信息头指针voidPrintPixelData(BYTE*imgData,intwidth,intheight,intbitCount)打印位图的像素数据image:位图像素数据指针;dwWidth:位图宽度;dwHeight:位图高度;wBitCount:位数intSaveAsImage(char*filepath)另存为位图filepath:预保存图片指定路径保存成功返回0,否则返回-13.4.2库函数说明函数功能说明输入参数说明输出参数说明intfread(void*ptr,intsize,intnitems,FILE*stream)从一个流中读数据ptr:接收数据的地址;size:单个元素的大小,单位是字节指针;nitems:元素个数;stream:提供数据的文件指针返回成功读取的元素个数intfwrite(void*ptr,intsize,intnitems,向文件读入写入一个数据块ptr:输出数据的地址;返回实际写入的数据块数目FILE*stream)size:单个元素的大小,单位是字节指针;nitems:元素个数;stream:目标文件指针intfseek(FILE*stream,longoffset,intfromwhere)移动文件指针stream:文件指针;offset:偏移量;fromwhere:起始地址指针移动成功返回0,否则返回其他值void*memcpy(void*destin,void*source,unsignedn)由指定内存区域复制指定个字节到指定内存区域destin:目标内存区;source:源内存区;n:预复制字节数3.4.3函数依赖关系调用函数被调用的函数ReadPixelDataReadFileHeader,ReadInfoHeader,GetLineBytesPrintPixelDataGetLineBytesSaveAsImageGetLineBytes3.5核心函数算法流程这里只说明处理8位位图的算法,24位位图的处理基本相同,只是分别处理R、G、B三个。3.5.1直方图均衡函数intGrayEqualize(BYTE*image,DWORDdwWidth,DWORDdwHeight,WORDwBitCount)if(bitCount==8){for(i=0;iheight;i++){//读取原文件直方图for(j=0;jwidth;j++){g=*(temp+lineBytes*(height-1-i)+j);//计算像素点的灰度级grayNum[g]++;//计算各个灰度级个数}}for(n=0;n256;n++){//重新定义灰度级c=0;for(m=0;m=n;m++)c+=grayNum[m];grayMap[n]=(BYTE)(c*255/height/width);}for(i=0;iheight;i++){//生成新直方图for(j=0;jwidth;j++){g=*(temp+lineBytes*(height-1-i)+j);//计算像素点原灰度级*(temp+lineBytes*(height-1-i)+j)=grayMap[g];//给像素点赋上新灰度级}}}3.5.2线性变换函数intLineTranslation(BYTE*image,DWORDdw
本文标题:数字图像处理文档-直方图均衡&灰度线性变换&灰度拉伸
链接地址:https://www.777doc.com/doc-5494069 .html