多媒体技术实习报告.doc_第1页
多媒体技术实习报告.doc_第2页
多媒体技术实习报告.doc_第3页
多媒体技术实习报告.doc_第4页
多媒体技术实习报告.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

多媒体应用技术实习报告071082班余义元实习要求:1、用VC或matlab读取一副bmp格式图象的灰度值,并将该灰度值以文本格式保存起来。 2、以8*8为模块,将读取的灰度值做离散余弦变换,并将变换后的值以文本格式保存起来。 3、对经离散余弦变换后的频率系数进行量化,量化后按照Z字形的样式编排。 4、将以上变换后得到的直流系数进行差分编码,交流系数进行哈弗曼编码。实习步骤:按照实习要求依次对图象做相应的处理,对于读取灰度值,采用VC+来读取,而其余部分用matlab做。以下介绍用VC+来读取bmp格式图象的灰度值。bmp格式图象包括4个部分,文件头、信息头、彩色表和图像数据部分,由于我们处理的是灰度图像,故彩色表部分可以不管,以下是打开bmp格式图像,并将头指针和数据指针分别指向图像的文件头和数据部分的VC程序:bool CBmpProcess:OpenBmpFile(CFile * pFile,BITMAPINFO * &m_pBmpInfo,BYTE * &m_pBmpData)BITMAPFILEHEADER bfh;/文件头BITMAPINFOHEADER bih;/信息头BITMAPINFO* pBMINFO=NULL;BYTE* pData=NULL;DWORD dwSize=0;pFile-SeekToBegin(); /将文件指针移到文件头pFile-Read(void*)&bfh,sizeof(BITMAPFILEHEADER); /读文件头,返回字节数pFile-Read(void*)&bih,sizeof(BITMAPINFOHEADER);/读信息头,返回字节数dwSize=bfh.bfOffBits-sizeof(BITMAPFILEHEADER);pBMINFO=(BITMAPINFO*)new chardwSize;pFile-Seek(sizeof(BITMAPFILEHEADER),CFile:begin);pFile-Read(pBMINFO,dwSize);m_pBmpInfo=(BITMAPINFO*)new chardwSize;memcpy(m_pBmpInfo,pBMINFO,dwSize);/dwSize=bfh.bfSize-bfh.bfOffBits;pData=(BYTE*)new chardwSize;if(pData=NULL)return FALSE;pFile-Seek(bfh.bfOffBits,CFile:begin);pFile-Read(void*)pData,dwSize);m_pBmpData=(BYTE*)new chardwSize;memcpy(m_pBmpData,pData,dwSize);/Record the bmp file datam_pBmpInfo=pBMINFO;m_pBmpData=pData;return TRUE;这段程序只是对图像内部的数据做处理,要真正实现打开文件,可以用对话框形式来打开,如下程序所示:void CDmtView:OnFileOpen() / TODO: Add your command handler code hereInvalidate(FALSE);HRESULT rval; CString FileName;/设计一“打开”对话框CFileDialog FileDia(TRUE,bmp,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,BMP文件 (*.bmp)|*.bmp|所有文件 (*.*)|*.*|);/调用CFileDialog类的DoModal成员函数显示对话框,/允许用户输入rval=FileDia.DoModal();/如果DoModal返回IDOK,就调用CFileDialog类的成员函数/GetPathName()获取用户输入的文件路径if(rval=IDCANCEL)return;FileName=FileDia.GetPathName(); /定义一CFile类对象fileCFile file;/定义一BITMAPFILEHEADER结构体变量bfhBITMAPFILEHEADER bfh; /创建好CFile类对象file后,使用Open()打开文件/GetBuffer()函数取内存中的值rval=file.Open(FileName.GetBuffer(0),CFile:modeRead|CFile:typeBinary,NULL);/若打开文件错误则返回if(!rval)return;/从当前文件位置开始,读BMP文件头数据。/&bfh为接收数据缓冲区的指针,sizeof(bfh)为读取的字节数file.Read(&bfh,sizeof(bfh); /bfh的bfType成员内容为固定值BM,用于标志文件格式,/表示该图像文件为BMP文件if(bfh.bfType!=0x4d42)/WrongFile();file.Close();return;/调用函数OpenBMPFile() 读入位图数据rval=m_bmpProcess.OpenBmpFile(&file,m_bmpProcess.m_pBmpInfo,m_bmpProcess.m_pBmpData);if(rval=FALSE)file.Close();return;file.Close();Invalidate(FALSE);m_flag = true;此程序中m_flag为一标志量,当打开并读取图像成功,给m_flag赋1,打开失败则赋0。图像打开后,就是要将图像灰度值读取出来并保存到文本文件中,此处可以调用打开文件时得到的数据指针,直接用此指针读取灰度值,程序如下:void CDmtView:OnSave1() / TODO: Add your command handler code here unsigned char a,b,c,g; int m=0;CFile mFile(d:a1.txt,CFile:modeWrite|CFile:modeCreate);DWORD lRowBytes = WIDTHBYTES(m_bmpProcess.m_pBmpInfo-bmiHeader.biWidth)*8);DWORD w=m_bmpProcess.m_pBmpInfo-bmiHeader.biWidth;DWORD h=m_bmpProcess.m_pBmpInfo-bmiHeader.biHeight; LPBYTE lpData=m_bmpProcess.m_pBmpData;char sRead15000;for(int i=0;ih;i+)for(int j=0;jw;j+) g=(unsigned char)(*(lpData+i*lRowBytes+j); a=g/100; b=(g-100*a)/10; c=g-100*a-10*b; sReadm=a+0; sReadm+1=b+0; sReadm+2=c+0; sReadm+3=32; m=m+4;mFile.WriteHuge(sRead,10000);mFile.Flush();mFile.Close();此段程序完全是由个人编写,程序中读写的图像大小由个人而定,此处是选择50*50的图像,便于观察结果。该部分经过慢慢调试,最后可以将指定的图像打开并显示出来,可以将其灰度值保存到文本文件中。 接下来的几个部分均用matlab来完成,用matlab来编写更方便,首先是对图像做离散余弦变换,由于图像是二维图像,故要用二维离散余弦变换,而二维离散余弦变换可由2次一维离散余弦变换来实现,其算法如下:F(u,v)=1/2 C(u)G(i,v)cos(2i+1)u/16G(i,v)=1/2C(v) f(i,j)cos(2j+1)v/16以下是实现程序:一维离散余弦变换:function B=DCT1D(A)n=length(A);T=zeros(1,n);C=A,T;C=FFT1D(C)*2*n;T=C(1:n);T(1)=T(1)/n0.5;for u=2:n T(u)=(2/n)0.5*T(u)*exp(-i*(u-1)*pi/2/n);endB=real(T);二维离散余弦变换:function C=DCT2D(B)a=length(B);C=zeros(a);for b=1:a C(b,:)=DCT1D(B(b,:);endfor b=1:a T=C(:,b); T1=DCT1D(T); C(:,b)=T1;end在一维离散余弦变换中调用到快速傅里叶变换,这里不做解释,二维离散余弦变换要调用两次一维离散余弦变换来实现。 调用以上函数就可以实现将图像分成8*8的图像块,再对图像块做离散余弦变换,并定义Y分量量化矩阵为Y_Matrix=16 11 10 16 24 40 51 61; 12 12 14 19 26 58 60 55; 14 13 16 24 40 57 69 56; 14 17 22 29 51 87 80 62; 18 22 37 56 68 109 103 77; 24 35 55 64 81 104 113 92; 49 64 78 87 103 121 120 101;72 92 95 98 112 100 103 99;于是8*8图像矩阵进行DCT变化和量化程序为:function B=DCT_Measure(A)Y_Matrix=16 11 10 16 24 40 51 61; 12 12 14 19 26 58 60 55; 14 13 16 24 40 57 69 56; 14 17 22 29 51 87 80 62; 18 22 37 56 68 109 103 77; 24 35 55 64 81 104 113 92; 49 64 78 87 103 121 120 101;72 92 95 98 112 100 103 99;C=double(A)-128;B=round(DCT2D(C)./Y_Matrix); 接下来就是对量化后的系数进行编码,编码程序如下:function B=Code_Huffman(A)DC_Huff=00,010,011,100,101,110,1110,11110,111110,1111110,11111110,111111110;fid=fopen(AC_Huff.txt,r);AC_Huff=cell(16,10);for a=1:16 for b=1:10 temp=fscanf(fid,%s,1); AC_Huff(a,b)=temp; endendfclose(fid);i=1;for a=1:15 if a=8 for b=1:a if mod(a,2)=1 Z(i)=A(b,a+1-b); i=i+1; else Z(i)=A(a+1-b,b); i=i+1; end end else for b=1:16-a if mod(a,2)=0 Z(i)=A(9-b,a+b-8); i=i+1; else Z(i)=A(a+b-8,9-b); i=i+1; end end endend%-%if Z(1)=0 sa.s=DC_Huff(1); sa.a=0; dc=strcat(sa.s,sa.a);else n=fix(log2(abs(Z(1)+1; sa.s=DC_Huff(n); sa.a=binCode(Z(1); dc=strcat(sa.s,sa.a);end%-%if isempty(find(Z(2:end) rsa(1).r=0; rsa(1).s=0; rsa(1).a=0; else T=find(Z); T=0 T(2:end); i=1; j=2; while j=length(T) t=fix(T(j)-1-T(j-1)/16); if t=0 rsa(i).r=T(j)-T(j-1)-1; rsa(i).s=fix(log2(abs(Z(T(j)+1; rsa(i).a=Z(T(j); i=i+1; else for n=1:t rsa(i)=struct(r,15,s,0,a,0); i=i+1; end rsa(i).r=T(j)-1-16*t; rsa(i).s=fix(log2(abs(Z(T(j)+1; rsa(i).a=Z(T(j); i=i+1; end j=j+1; end if T(end)64 rsa(i).r=0; rsa(i).s=0; rsa(i).a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论