数字图像处理实验报告(共43页).docx
《数字图像处理实验报告(共43页).docx》由会员分享,可在线阅读,更多相关《数字图像处理实验报告(共43页).docx(43页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上数字图像处理实验报告专 业: 软件工程 姓 名: 王鹏飞 学 号: S 指导老师: 王素玉 2019年 12 月 28 日信息学部软件学院专心-专注-专业目录实验要求:用 c/c+语言编程实现以下功能实验环境:Windows10开发工具:CodeBlocks实验一、BMP文件的读写1 实验目的与实验内容1.1灰度 BMP 图像的读写: (1) 读入 lena.bmp 文件; (2) 通过文件内容得出文件大小,位图数据起始字节,图像长、宽以及每像素的位数等信息; (3) 提取出原图像中的位图数据,另存为 lena.raw, 并通过 photoshop 打开该 文件,查看
2、所读取的数据。 (4) 仅取原始图像左上角 1/4 的数据,另存一个 lenas.bmp 图像,在 photoshop 中打开查看效果。1.2 彩色 BMP 图像读写 (1) 读入文件 lena_C.bmp 文件; (2) 通过文件内容得出文件大小,位图数据起始字节,图像长、宽以及每像素 的位数等信息; (3) 提取出原图像中的位图数据,另存为 lena_C.raw, 并通过 photoshop 打开 该文件,查看所读取的数据。 (4) 仅取原始图像左上角 1/4 的数据,另存一个 lena_Cs.bmp 图像,在 photoshop 中打开查看效果。 2 实验原理通过C语言读取BMP文件,读
3、入图像的文件指针、宽、高、颜色表、图像类型、每像素位数。BMP文件的数据按照从头文件开始的顺序分为BMP头、位图信息头、调色板、位图数据。3 实验关键代码源代码如下:/申请位图文件头结构变量,填写文件头信息BITMAPFILEHEADERfileHead;fileHead.bfType=0x4D42;/bmp类型/bfSize是图像文件4个组成部分之和fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+lineByte*height;fileHead.bfReserved1=0;fil
4、eHead.bfReserved2=0;/bfOffBits是图像文件前3个部分所需空间之和fileHead.bfOffBits=54+colorTablesize;/写文件头进文件fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp2);/申请位图信息头结构变量,填写信息7头信息BITMAPINFOHEADERhead;head.biBitCount=biBitCount;head.biClrImportant=0;head.biClrUsed=0;head.biCompression=0;head.biHeight=height;head.biPla
5、nes=1;head.biSize=40;head.biSizeImage=lineByte*height;head.biWidth=width;head.biXPelsPerMeter=0;head.biYPelsPerMeter=0;/写位图信息头进内存fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp2);/如果灰度图像,有颜色表,写入文件RGBQUAD*pColorTable1;if(biBitCount=8)pColorTable1=newRGBQUAD256;fread(pColorTable1,sizeof(RGBQUAD),256,fp1);i
6、f(biBitCount=8)fwrite(pColorTable1,sizeof(RGBQUAD),256,fp2);/写位图数据进文件inty=(biWidth*biBitCount/8+3)/4*4;fseek(fp1,-y*biHeight/2,2);longq;if(q=ftell(fp1)=-1L) puts(GetBitmapHeader读取文件指针位置失败!);return0;elseprintf(起始字节:%dn,q);pBmpBuf1=newunsignedcharlineByte*biHeight;printf(helloworld1);intt;for(t=0;tbiH
7、eight/2;t+)fread(pBmpBuf1,1,y/2,fp1);fseek(fp1,y/2,1);fwrite(pBmpBuf1,y/2,1,fp2);fclose(fp2);fclose(fp1);return1;4 实验运行结果(1)灰度图像运行结果 灰度图lena.bmp文件 lenas.bmp文件由运行结果可知该灰度图的大小为字节,长和宽都为512字节,每个像素的位数为8位,位图数据起始字节为字节。(2)彩色图像运行结果 lena_C.bmp文件 lena_Cs.bmp文件由运行结果可知,该彩色图像的大小为字节,长和宽均为512字节,每个像素的位数为24位,位图数据起始字节为
8、字节。5 总结通过本次实验,学会了如何读取BMP图像中的信息,尤其是BMP中的信息变量设置较多,这点存在很大的难度。实验二、图像缩放1 实验目的及内容2.1 灰度图像最近邻缩放: (1) 读入 lena.bmp 文件; (2) 采用最近邻方法将原图长宽各缩小 2 倍,即隔 1 点取 1 点,存为 lenas.bmp; (3) 采用最近邻方法将 lenas.bmp 重新放大到原来的尺寸,存为 lenasz.bmp, 比较其与原图 lena.bmp 的区别; (4)将缩放倍数改为 4 重复上述步骤。2.2 灰度图像双线性插值缩放 (1) 读入文件 lena.bmp 文件;(2) 采用双线性插值法将
9、图像缩小 2 倍(将源图像相邻两个像素平均后作为一个像素),存为 lenas1.bmp; (3) 将缩小后的图像放大回原来的尺寸,存为 lenasz1.bmp,对比其与原始图 像 lena.bmp 的异同。 (4) 将放大倍数改为任意值,重复以上步骤。 2.3 将灰度图改为彩色图像重复 1、2 内容。2 实验原理2.1 最近邻缩放原理不需要计算,在待求象素的四邻象素中,将距离待求象素最近的邻象素灰度赋给待求象素。设i+u, j+v(i, j为正整数, u, v为大于零小于1的小数,下同)为待求象素坐标,则待求象素灰度的值 f(i+u, j+v),如下图所示:如果(i+u, j+v)落在A区,即
10、u0.5, v0.5,则将左上角象素的灰度值赋给待求象素,同理,落在B区则赋予右上角的象素灰度值,落在C区则赋予左下角象素的灰度值,落在D区则赋予右下角象素的灰度值。最邻近元法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。2.2 双线性插值法原理双线性插值原理图,x-y坐标系、已知Q12,Q22,Q11,Q21四个点的值,求P点值。首先在Q11Q21、Q12Q22方向上进行两次线性插值,得到R1、R2;然后在R1R2方向再做一次线性插值,得到P点。这就是双线性插值。双线性插值关键的是P点在x,y两个方向上相对已知Q点的位置。令: = (x-x1)
11、/ (x2-x1) =(y-y1) / (y2-y1) ,则 R1= Q11 + (Q21 - Q11) * = (1 -)*Q11 +*Q21,R2= Q12 + (Q22 - Q12) * = (1 -)*Q12 +*Q22;P =(1 - )*R1+ *R2=(1 -)(1 -)*Q11 +(1 -)*Q21 + *(1 -)*Q12 +*Q22 =(1 -)*(1 -)*Q11 + *Q12) +*(1 -)*Q21 + *Q22)3 实验关键代码和运行结果最邻近插值法主要代码:for (int i = 0; i dstHeight; +i)for (int j = 0; j dstW
12、idth; +j)unsigned char *p1, *p2;x = round(double(1/lx*j);y = round(double(1/ly*i);p1 = (unsigned char *)(pBmpBuf2 + i*lineByte2 + j);p2 = (unsigned char *)(pBmpBuf + y*lineByte + x);(*p1) = (*p2);方法二:双线性插值法:int x1, x2, y1, y2, Fq11, Fq12, Fq21, Fq22;double x, y, r1, Fr1, Fr2, Fp;for (int i = 0; i ds
13、tHeight; +i)for (int j = 0; j = 0 & Fp 1)。(4)根据公式求取像素映射关系ss(i)=intmax(pix)-min(pix)*s(i)+0.5其中,pix指原图像中的灰度值,需要求取原图像中的最大灰度值减去最小灰度值。而有的均衡化理论中是(2n-1)-0,也就是该灰度级中的最大值减去灰度最小值。ss(i)是第i灰度级所对应的均衡化图像中的灰度级。(5)灰度映射上一步找到了原图像和均衡化图像灰度的对应关系,对原图进行操作,将每个像素映射成新的像素即可。3 实验关键代码和实验结果关键代码如下:void savefile(char *filename ,ch
14、ar *filename1,unsigned char *image2000,int w,int h)FILE *fp=fopen(filename,rb);if(fp=NULL)coutcan not open this file.n;return;FILE *fp1=fopen(filename1,wb);if(fp1=NULL)coutcan not open this file1.n;return;BITMAPFILEHEADER bf;fread(&bf,sizeof(BITMAPFILEHEADER),1,fp);BITMAPINFOHEADER info;fread(&info,
15、sizeof(BITMAPINFOHEADER),1,fp);RGBQUAD *rgb;rgb=(RGBQUAD *)malloc(256*sizeof(RGBQUAD);fread(rgb,sizeof(RGBQUAD),256,fp);fwrite(&bf,sizeof(BITMAPFILEHEADER),1,fp1);fwrite(&info,sizeof(BITMAPINFOHEADER),1,fp1);fwrite(rgb,sizeof(RGBQUAD),256,fp1);unsigned char *image12000;int law_size;law_size=(w+3)/4*
16、4;int i,j;for(i=0;ih;i+)image1i=new unsigned char law_size;for(i=0;ih;i+)for(j=0;jlaw_size;j+)image1ij=0;int n256=0;double a;double p256;for(i=0;ih;i+) for(j=0;jlaw_size;j+) nimageij+; for(i=0;i256;i+) a=(double)(ni)/(1.0*(h*law_size); pi=a;double s256=0;s0=p0;for(i=1;i256;i+) si=pi+si-1;for(i=0;ih;
17、i+)for(j=0;jlaw_size;j+)image1ij=(int)(simageij*255+0.5);for(i=0;ih;i+)fwrite(image1i,sizeof(unsigned char),law_size,fp1);fclose(fp1);fclose(fp);实验结果 直方图均衡化原图像 直方图均衡化实验结果图像 彩色图像均衡化处理后4 思考题彩色图像 image_color 能否进行直方图均衡?如何进行?由于直方图均衡是对于灰度图的图像处理方法,它是利用图像直方图对对比度进行调整的方法。因此直方图均衡并不能直接用于彩色图像的处理。但是由于彩色图像的本质是由R、G
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 实验 报告 43
限制150内