图像压缩实验指导书

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

数字图像处理上机实验指导书童立靖北方工业大学计算机学院tong_lijing@163.com北方工业大学2020-1-3第2页/共9页实验四图像压缩一、实验目的、要求与环境1.1目的:通过实验,了解数字图象压缩的一般方法,掌握图像压缩的编程方法,了解图象压缩效果的评价方法。1.2要求:对自选的图象进行离散余弦变换,将其进行图象压缩处理,自行设计量化矩阵,与编码方法,并计算压缩比,提交实验报告。进度较快的同学,可以设计三种不同的量化矩阵或编码方法,完成三种不同程度的压缩,对比解压缩后的图像质量,并进行分析。(给分较高)1.3环境:WindowsXP操作系统MicrosoftVisualC++6.0(SP6)自带8位灰度图像文件:lena-gray.bmp:北方工业大学2020-1-3第3页/共9页二、实验步骤1.准备相关图像文件。2.在XP操作系统上,打开MicrosoftVisualC++6.0(SP6),编写相关程序,完成对离散余弦变换系数的量化矩阵设计与编码方法。4.对程序进行相关调试,修改程序,去除其中的BUG。5.利用自己准备的图像的文件,和编写的程序,将给定的图象进行压缩处理。6.截屏,保留实验结果。7.计算压缩比,进行实验结果分析。8.撰写并提交实验报告。三、注意事项1.实验任务:Windows下完成图像压缩的程序编写。2.去多模式教学网上下载程序框架:DCT-Quantify8-Frame.rar。3.图像高度、宽度须是8的倍数。BMP格式,8位灰度图像。4.对于一幅彩色图像,可以在photoshop中,图像=》模式=》灰度=》扔掉文件=》存储为=》保存=》选择8位深度=》确定。5.实验完成时间:先在课下完成程序编写,然后课上完成验机。第15周的周一、第15周的周五,二次实验课。6.请记录实验报告中相应的贴图:可以用屏幕拷贝,然后再用Photoshop中的工具中修剪一下。7.请每位同学用自己的图像文件进行实验:若2位同学使用的图像文件一样,两位均依抄袭计0分。北方工业大学2020-1-3第4页/共9页8.请每位同学自己编写程序:若2位同学编写的程序发现抄袭,两位均计0分。9.来后请签到。10.做完后请验机:验机在课内完成,由于同学较多,请大家尽可能提前验机,以免最后大家等待的时间较长。11.课后完成实验报告。12.实验报告:若发现2位同学的实验报告抄袭,两位均计0分。13.实验报告模板:去多模式教学网上下载《42实验报告模板-图像压缩20150128.doc》,然后填入自己的上机相关内容14.实验报告,每位同学在第16周周一,由课代表按学号排序上交,逾期不收(因为一周内课程成绩必须要上报到教务处)。四、框架程序1.量化表为:doubleQuantTbl[8][8]={//012345670,0,0,0,0,0,0,0,//70,0,0,0,0,0,0,0,//60,0,0,0,0,0,0,0,//50,0,0,0,0,0,0,0,//41,1,1,1,0,0,0,0,//31,1,1,1,0,0,0,0,//21,1,1,1,0,0,0,0,//12,1,1,1,0,0,0,0//0};实验时请根据需要修改量化表。2.请补充下列程序:目标是:BOOLCBMPEdit::DCTQuantify()把double*pFuvArray(height*width)中的DCT系数(已完成8*8的DCT北方工业大学2020-1-3第5页/共9页变换),按照量化表doubleQuantTbl[8][8]进行量化,到__int8*pQuantResult(height*width);BOOLCBMPEdit::DCTWrite()把量化后的系数__int8*pQuantResult(height*width)有选择的存入文件,使用CFileBOOLCBMPEdit::IDCTRead()在DCT反变换时,把文件读入内存中的__int8*pQuantResult(height*width),使用CFile,注意数据位置的控制。BOOLCBMPEdit::IDCTQuantify()把内存中的__int8*pQuantResult(height*width)进行反量化,存入double*pFuvArray(height*width)3.可以分3步完成:1.把double*pFuvArray(height*width)中的DCT系数存入磁盘文件,再把文件读入内存中double*pFuvArray(height*width)。验证程序正确性。2.修改量化表数值为非0,进行量化与反量化的过程。3.修改量化表数值为部分为0,存储时舍弃量化表中为0位置的频谱数据,进行压缩编码存储。4.CFile文件类的使用:向文件写入数据示例:CFileQuantFile(quantify.txt,CFile::modeCreate|CFile::modeReadWrite);QuantFile.Write(pQuantResult,n);QuantFile.Close();从文件读取数据示例:CFileQuantFile(quantify.txt,CFile::modeReadWrite);QuantFile.Read(pQuantResult,n);QuantFile.Close();sprintf(oneline,%d,%d,%10d,%10lf,%10lf\r\n,u,v,p,r,Q);北方工业大学2020-1-3第6页/共9页5.各编写函数的功能BOOLCBMPEdit::DCTQuantify(){intheight=m_BmpInfo.bmiHeader.biHeight;intwidth=m_BmpInfo.bmiHeader.biWidth;pQuantResult=new__int8[height*width];//addyourcodehere//对DCT系数进行量化//对DCT的系数pFuvArray[]进行量化//即对pFuvArray[]中的数据除以量化表QuantTbl[][],//需要考虑量化表8*8的位置对应,以及量化表中为0数据的量化处理//量化结果放入量化结果缓冲区pQuantResult[]returnTRUE;}BOOLCBMPEdit::DCTWrite(){//addyourcodehere//把量化后的系数写入文件。//可有所选择//把量化后的数据pQuantResult[]写入文件//对于量化表QuantTbl[][]中为0的数据的对应位置,无需存储。//向文件写入数据示例://CFileQuantFile(quantify.txt,CFile::modeCreate|CFile::modeReadWrite);//QuantFile.Write(pQuantResult,n);//QuantFile.Close();returnTRUE;}BOOLCBMPEdit::IDCTRead(){//addyourcodehere//把写入系数的文件读入内存//把文件中的数据读入量化结果缓冲区pQuantResult[]北方工业大学2020-1-3第7页/共9页//对于量化表QuantTbl[][]中为0数据所对应的位置,补入0。//从文件读取数据示例://CFileQuantFile(quantify.txt,CFile::modeReadWrite);//QuantFile.Read(pQuantResult,n);//QuantFile.Close();returnTRUE;}BOOLCBMPEdit::IDCTQuantify(){//addyourcodehere//对量化后的系数进行反量化处理//对文件读入的数据pQuantResult[]进行反量化//即对pQuantResult[]中的数据乘以量化表QuantTbl[][]//需要考虑量化表8*8的位置对应。//反量化结果放入pFuvArray[]中returnTRUE;}可根据需要自行调整设计。6.关键数据结构的说明*pImageData:图像原始数据缓冲区指针。*pData:图像显示缓冲区指针。*pDCTResultD:图像DCT变换后用于显示的数据缓冲区指针。*pIDCTResult:对DCT变换结果进行IDCT变换的结果数据缓冲区指针。HGLOBALm_hgImageData;//图像数据句柄HGLOBALm_DCTResultD;//DCT变换结果显示缓冲区句柄HGLOBALm_IDCTResult;//IDCT反变换结果缓冲区句柄HGLOBALm_Error;//IDCT反变换结果-原图句柄double*pFuvArray;//DCT变换结果缓冲区double*pImage8;//8*8变换图像缓冲区double*pFuv8;//8*8变换频谱缓冲区北方工业大学2020-1-3第8页/共9页__int8*pQuantResult;//DCT量化结果7.菜单DCT变换的接口voidCMy02testView::OnDCTTransform(){//TODO:AddyourcommandhandlercodehereCMy02testDoc*pDoc=GetDocument();pDoc-m_BMP.DCTTransform();pDoc-m_BMP.DCTQuantify();pDoc-m_BMP.DCTWrite();pDoc-m_BMP.PlayBmpDCT(m_pMemDC,CPoint(0,0));Invalidate(FALSE);}8.菜单DCT反变换的接口voidCMy02testView::OnIDCTTransform(){//TODO:AddyourcommandhandlercodehereCMy02testDoc*pDoc=GetDocument();pDoc-m_BMP.IDCTRead();pDoc-m_BMP.IDCTQuantify();pDoc-m_BMP.IDCTTransform();pDoc-m_BMP.PlayBmpIDCT(m_pMemDC,CPoint(0,0));Invalidate(FALSE);}9.菜单残差的接口voidCMy02testView::OnError(){//TODO:AddyourcommandhandlercodehereCMy02testDoc*pDoc=GetDocument();pDoc-m_BMP.Error();pDoc-m_BMP.PlayBmpError(m_pMemDC,CPoint(0,0));北方工业大学2020-1-3第9页/共9页Invalidate(FALSE);}10.相关函数说明主要功能函数:BOOLCBMPEdit::LoadBmpFile(constCString&sBmpFileName)主要功能:读入BMP文件。在此函数中,读入原来图像的数据,并把图像原始数据存入数据缓冲区。主要功能函数:BOOLCBMPEdit::PlayBmp(CDC*pDC,constCPoint&StartPoint)主要功能:把图像数据写入CDC,供显示用。在此函数中,把读入的原始图像数据区里的数据写到pDC-GetSafeHdc(),即CDC里。主要功能函数:BOOLCBMPEdit::DCTTransform()主要功能:DCT变换。在此函数中,取出图像数据缓冲区的数据,并对其进行DCT变换。主要功能函数:BOOLCBMPEdit::IDCTTransform()主要功能:IDCT变换。在此函数中,取出图像DCT变换结果缓冲区的数据,并对其进行IDCT变换。主要功能函数:BOOLCBMPEdit::PlayBmpDCT(CDC*pDC,constCPoint&StartPoint)主要功能:把图像数据写入CDC,供显示用。在此函数中,把图像DCT变换结果数据区里的数据写到pDC-GetSafeHdc()

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功