您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > project3_xiaohuavivian_DCT变换
多媒体技术实验报告项目名称:DCT变换提交文档学生姓名:xiaohuavivian提交文档学生学号:教师评阅成绩:教师评阅意见:..提交报告时间:2014年12月10日1.实验题目:掌握DCT变换及DCT反变换的原理及步骤了解DCT变换后图像的特点2.实验要求:1)读入给定的BMP格式图像,如Fig7.bmp,Fig8.bmp,要求通过控制台输入图像文件名2)对输入图像进行N*N分块,然后对每块作DCT变换,将变换结果以BMP格式文件输出.要求通过控制台输入N的具体值.3)观察步骤2)输出的结果图像4)将步骤2)得到的变换结果进行N*NDCT反变换,将反变换结果以BMP格式文件输出。注意,此处的N一定与步骤2)的N取值一致。5)观察对比原始图像与步骤4)结果图像的异同。3.实验环境:Windows7、VC6.04.算法描述:程序流程图测试程序说明测试程序为编写在主函数main()里的测试程序。运行进入控制台选择要进行DCT变换和DCT反变换的BMP图像,再输入N值。程序跳过头文件信息,包括位图文件头,位图信息头,调色板等,申请颜色表的空间,读颜色表进入内存,申请图像数据空间,变换后写入文件,最后进行图像对比。5.源程序清单:添加必要的注释#includewindows.h#includestdio.h#includeiostream.h#includefstream.h#includemath.h#defineWIDTHBYTES(i)((i+31)/32*4)#definePI3.141592#defineSQRTMNsqrt(N*N)BITMAPFILEHEADERbf;//位图文件头BITMAPINFOHEADERbi;//位图信息头RGBQUAD*pColorTable;//调色板信息unsignedchar**ImageData;//原始图像信息unsignedchar**Image;//DCT反变换之后的图像信息unsignedchar**ImageDCT;//DCT变换之后的图像信息double**DCTData;intN;charfilename[20];ints=0;longLineBytes;longheight;intnumberblockHeight,numberblockWidth;doubleC(inta){doublevalue;if(a==0){value=sqrt(2)/2;}else{value=1;}returnvalue;}//DCT变换函数doubleDCT(intu,intv,inti,intj,unsignedchar**image){doublevalue=0,a,b;intm,n;doublepara=2*C(u)*C(v)/SQRTMN;for(m=0;mN;m++){for(n=0;nN;n++){a=cos(PI*(2*m+1)*u/(2*N));b=cos(PI*(2*n+1)*v/(2*N));value+=a*b*image[i*N+m][j*N+n];}}value=value*para;returnvalue;}//DCT反变换函数unsignedcharIDCT(intu,intv,inti,intj,double**F){doublevalue=0,a,b;intm,n;doublepara;for(m=0;mN;m++){for(n=0;nN;n++){para=2*C(m)*C(n)/SQRTMN;a=cos(PI*(2*u+1)*m/(2*N));b=cos(PI*(2*v+1)*n/(2*N));value+=para*a*b*F[i*N+m][j*N+n];}}return(unsignedchar)value;}voidmain(){FILE*fp,*fpWrite;inti,j,u,v;doublemax=0,min=0;puts(pleaseinputthefilename:);gets(filename);//读取图片信息fp=fopen(filename,rb);if(fp==NULL)puts(openthefilefail!);//跳过各种头文件信息,包括位图文件头,位图信息头,调色板fread(&bf,sizeof(BITMAPFILEHEADER),1,fp);fread(&bi,sizeof(BITMAPINFOHEADER),1,fp);//灰度图像8位颜色表if(bi.biBitCount==8){//申请颜色表的空间,读颜色表进入内存pColorTable=(RGBQUAD*)malloc(sizeof(RGBQUAD)*256);fread(pColorTable,sizeof(RGBQUAD),256,fp);}printf(pleaseinputthevalueofN:);scanf(%d,&N);//计算图像每行像素所占的字节数,必须为N的整数倍LineBytes=(WIDTHBYTES(bi.biWidth*bi.biBitCount)+N-1)/N*N;numberblockWidth=LineBytes/N;height=(bi.biHeight+N-1)/N*N;numberblockHeight=height/N;//申请图像数据空间Image=(unsignedchar**)malloc(height*sizeof(unsignedchar*));for(i=0;iheight;i++){Image[i]=(unsignedchar*)malloc(LineBytes);}ImageData=(unsignedchar**)malloc(height*sizeof(unsignedchar*));for(i=0;iheight;i++){ImageData[i]=(unsignedchar*)malloc(LineBytes);}ImageDCT=(unsignedchar**)malloc(height*sizeof(unsignedchar*));for(i=0;iheight;i++){ImageDCT[i]=(unsignedchar*)malloc(LineBytes);}DCTData=(double**)malloc(height*sizeof(double*));for(i=0;iheight;i++){DCTData[i]=(double*)malloc(LineBytes*sizeof(double));}//把数组全部置为零for(i=0;iheight;i++){for(j=0;jLineBytes;j++){ImageData[i][j]=0;}}//读数据进内存for(i=0;ibi.biHeight;i++)fread(ImageData[i],LineBytes*sizeof(BYTE),1,fp);fclose(fp);//DCT变换for(i=0;inumberblockHeight;i++){for(j=0;jnumberblockWidth;j++){for(u=0;uN;u++)for(v=0;vN;v++){DCTData[u+i*N][v+j*N]=DCT(u,v,i,j,ImageData);}}}for(i=0;iheight;i++){for(j=0;jLineBytes;j++){if(min=DCTData[i][j])min=DCTData[i][j];if(max=DCTData[i][j])max=DCTData[i][j];}}//归一化doubletemp=max-min;for(i=0;iheight;i++){for(j=0;jLineBytes;j++){ImageDCT[i][j]=(unsignedchar)((DCTData[i][j]-min)/temp*255);}}//DCT反变换for(i=0;inumberblockHeight;i++){for(j=0;jnumberblockWidth;j++){for(u=0;uN;u++)for(v=0;vN;v++){Image[u+i*N][v+j*N]=IDCT(u,v,i,j,DCTData);}}}//写入文件fpWrite=fopen(DCT.bmp,wb);bi.biHeight=height;bi.biWidth=LineBytes;fwrite(&bf,sizeof(BITMAPFILEHEADER),1,fpWrite);fwrite(&bi,sizeof(BITMAPINFOHEADER),1,fpWrite);if(bi.biBitCount==8){fwrite(pColorTable,sizeof(RGBQUAD),256,fpWrite);}for(i=0;iheight;i++)fwrite(ImageDCT[i],LineBytes,1,fpWrite);fpWrite=fopen(IDCT.bmp,wb);bi.biHeight=height;bi.biWidth=LineBytes;fwrite(&bf,sizeof(BITMAPFILEHEADER),1,fpWrite);fwrite(&bi,sizeof(BITMAPINFOHEADER),1,fpWrite);if(bi.biBitCount==8){fwrite(pColorTable,sizeof(RGBQUAD),256,fpWrite);}for(i=0;iheight;i++)fwrite(Image[i],LineBytes,1,fpWrite);//释放缓存free(pColorTable);for(i=0;iheight;i++){free(ImageData[i]);}free(ImageData);for(i=0;iheight;i++){free(Image[i]);}free(Image);for(i=0;iheight;i++){free(ImageDCT[i]);}free(ImageDCT);for(i=0;iheight;i++){free(DCTData[i]);}free(DCTData);fclose(fpWrite);}6.运行结果:测试数据选择File:Fig7.BMP;N=16;File:Fig8.BMP;N=32.测试结果分析File:Fig7.BMP;N=16;(Fig7.BMP)(DCT变换)(DCT反变换)File:Fig8.BMP;N=32(Fig7.BMP)(DCT变换)(DCT反变换)7.实验运行情况分析(包括算法、运行结果、运行环境等问题的总体讨论)。收获1.掌握了DCT变换及DCT反变换的原理及步骤2.了解了DCT变换后图像的特点3.明白IDCT变换的输入为未归一化的DCT变换数据4.加强编写代码的能力5.复习了读写文件的只是特色1.代码清晰,注释清楚2.控制台进行读入文件的选择不足1.控制台进行文件读入的选择时不够完美;2.代码编写时函数名等应该更加规范3.主函数和实现函数应该分开,让读者更容易读懂。4.编写代码能力还需要加强。
本文标题:project3_xiaohuavivian_DCT变换
链接地址:https://www.777doc.com/doc-2852809 .html