多媒体实验报告.docx
- 文档编号:30405324
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:19
- 大小:18.69KB
多媒体实验报告.docx
《多媒体实验报告.docx》由会员分享,可在线阅读,更多相关《多媒体实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
多媒体实验报告
多媒体实验报告
完成时间:
2011.6.1
实验一
一、实验目的
1、了解有损压缩和无损压缩的概念
2、理解图像压缩的主要原则和目的
3、了解常用的压缩算法
4、了解静态图像JPEG压缩标准
二、实验内容
1、利用VC++编程,建立控制台应用程序(Win32ConsoleApplication),输入教材第83页的实力图像块数据,经离散余弦变换、量化和熵编码后,压缩为二进位流。
2、压缩后的二进位流编码,重构图像块
三、源代码:
#include"stdio.h"
#include"math.h"
intf_Y0[8][8]=
{
{139,144,149,153,155,155,155,155},
{144,151,153,156,159,156,156,156},
{150,155,160,163,158,156,156,156},
{159,161,162,160,160,159,159,159},
{159,160,161,162,162,155,155,155},
{161,161,161,161,160,157,157,157},
{162,162,161,163,162,157,157,157},
{162,162,161,161,163,158,158,158}
};
intF_Y0[8][8];//DC系数
intDA_Y0[64],DA_Y1[64],DA_Y2[64],DA_Y3[64],DA_Cb[64],DA_Cr[64];//DA系数
intquantization_table[8][8]={//量化表
{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}
};
constintjpeg_natural_order[64]={
0,1,8,16,9,2,3,10,
17,24,32,25,18,11,4,5,
12,19,26,33,40,48,41,34,
27,20,13,6,7,14,21,28,
35,42,49,56,57,50,43,36,
29,22,15,23,30,37,44,51,
58,59,52,45,38,31,39,46,
53,60,61,54,47,55,62,63,
};
voidDCT();//进行DCT转换
voidshow();//用于及时的显示
voidQuantization();//量化处理
voidZArrange();//Z字形编排
intmain(intargc,char**argv)
{
DCT();
printf("DCT变换之后:
\n");
show();
Quantization();
printf("量化变换之后:
\n");
show();
ZArrange();
printf("Z字型变换之后:
\n");
show();
return0;
}
voidDCT()
{
intu,v,i,j;
doubletmpY0;
doublecu,cv;
for(u=0;u<8;u++)
{
for(v=0;v<8;v++)
{
tmpY0=0.0;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
tmpY0=tmpY0+(f_Y0[i][j]-128)*cos((2*i+1)*u*0.19625)*cos((2*j+1)*v*0.19625);
}
}
if(u==0)
cu=0.707;
else
cu=1.0;
if(v==0)
cv=0.707;
else
cv=1.0;
F_Y0[u][v]=(int)((0.25)*cu*cv*tmpY0);
}
}
}
voidshow()
{
inti,j;
printf("f_Y0:
\n");
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
printf("%5d",f_Y0[i][j]);
}
printf("\n");
}
printf("\n");
printf("F_Y0:
\n");
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
printf("%5d",F_Y0[i][j]);
}
printf("\n");
}
printf("DA:
\n");
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
printf("%5d",DA_Y0[i*8+j]);
}
printf("\n");
}
}
voidQuantization()//量化处理
{
inti,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
F_Y0[i][j]=(int)F_Y0[i][j]/quantization_table[i][j];
}
}
}
voidZArrange()//Z字形编排
{
inti;
for(i=0;i<64;i++)
{
DA_Y0[i]=(int)F_Y0[jpeg_natural_order[i]/8][jpeg_natural_order[i]%8];
}
}
实验二
一、实验目的
1、理解小波的概念
2、理解小波变换的基本原理
3、掌握如何使用小波对图像进行变换
二、实验内容
(1)利用VC++编程,输入教材第154页的实力图像块矩阵A,经小波变换和列变换之后逐步变换为P155页上的矩阵,再取阈值,变换为矩阵A&;
(2)对矩阵A&进行逆变换,得到重构的近似矩阵
三、源代码
#include
#include
usingnamespacestd;
intmain(){
inti=0;
doubleR[8][8]={
64,2,3,61,60,6,7,57,
9,55,54,12,13,51,50,16,
17,47,46,20,21,43,42,24,
40,26,27,37,36,30,31,33,
32,34,35,29,28,38,39,25,
41,23,22,44,45,19,18,48,
49,15,14,52,53,11,10,56,
8,58,59,5,4,62,63,1
},N0[8][8],N1[8][8],N2[8][8];
//对行变换
for(;i<8;i++)
for(intj=0;j<8;j++){
//计算N0
N0[i][0]=(R[i][0]+R[i][1])/2;
N0[i][1]=(R[i][2]+R[i][3])/2;
N0[i][2]=(R[i][4]+R[i][5])/2;
N0[i][3]=(R[i][6]+R[i][7])/2;
N0[i][4]=R[i][0]-N0[i][0];
N0[i][5]=R[i][2]-N0[i][1];
N0[i][6]=R[i][4]-N0[i][2];
N0[i][7]=R[i][6]-N0[i][3];
//计算N1
N1[i][0]=(N0[i][0]+N0[i][1])/2;
N1[i][1]=(N0[i][2]+N0[i][3])/2;
N1[i][2]=N0[i][0]-N1[i][0];
N1[i][3]=N0[i][2]-N1[i][1];
N1[i][4]=N0[i][4];
N1[i][5]=N0[i][5];
N1[i][6]=N0[i][6];
N1[i][7]=N0[i][7];
//计算N2
N2[i][0]=(N1[i][0]+N1[i][1])/2;
N2[i][1]=N1[i][0]-N2[i][0];
N2[i][2]=N1[i][2];
N2[i][3]=N1[i][3];
N2[i][4]=N0[i][4];
N2[i][5]=N0[i][5];
N2[i][6]=N0[i][6];
N2[i][7]=N0[i][7];
}
for(i=0;i<8;i++)
for(intj=0;j<8;j++)
R[i][j]=N2[i][j];
//对列变换
for(i=0;i<8;i++)
for(intj=0;j<8;j++){
//计算N0
N0[0][j]=(R[0][j]+R[1][j])/2;
N0[1][j]=(R[2][j]+R[3][j])/2;
N0[2][j]=(R[4][j]+R[5][j])/2;
N0[3][j]=(R[6][j]+R[7][j])/2;
N0[4][j]=R[0][j]-N0[0][j];
N0[5][j]=R[2][j]-N0[1][j];
N0[6][j]=R[4][j]-N0[2][j];
N0[7][j]=R[6][j]-N0[3][j];
//计算N1
N1[0][j]=(N0[0][j]+N0[1][j])/2;
N1[1][j]=(N0[2][j]+N0[3][j])/2;
N1[2][j]=N0[0][j]-N1[0][j];
N1[3][j]=N0[2][j]-N1[1][j];
N1[4][j]=N0[4][j];
N1[5][j]=N0[5][j];
N1[6][j]=N0[6][j];
N1[7][j]=N0[7][j];
//计算N2
N2[0][j]=(N1[0][j]+N1[1][j])/2;
N2[1][j]=N1[0][j]-N2[0][j];
N2[2][j]=N1[2][j];
N2[3][j]=N1[3][j];
N2[4][j]=N0[4][j];
N2[5][j]=N0[5][j];
N2[6][j]=N0[6][j];
N2[7][j]=N0[7][j];
}
cout<<"A&="< for(i=0;i<8;i++,cout<<"\n") for(intj=0;j<8;j++){ if(abs(N2[i][j])<=5) N2[i][j]=0; cout< } return0; } 实验四 一、实验目的 1、进一步熟悉位图文件的格式; 2、掌握通过读取像素对图下个进行简单处理的方法; 3、掌握位图文件的存储方法; 4、获得利用VC++百年城处理图像的实际经验 二、实验内容 5、利用VC++编程,读取位图文件; 6、对位图做镜像处理; 7、保存处理后的图像 三、实验指导 图像的镜像变换分为两种: 一种是水平镜像,另一种是垂直镜像。 图像的水平镜像操作是以源图像的垂直中轴线为中心,将图像个分为左右两部分进行对称变换;图像的垂直镜像操作是以源图像的水平中轴线为中心,将图像个分为上下两部分进行对称变换; 四、源文件 #include #include usingnamespacestd; typedefstruct { shortintbfType; charbfSize[4]; shortbfReserved1; shortbfReserved2; shortbfOffBits; shortbi; }HEAD; typedefstruct { longintbiSize; longbiWidth; longbiHeight; shortintbiPlanes; shortintbiBitCount; intbiCompress; intbiSizeImage; intbiXPelsPerMeter; intbiYPelsPerMeter; intbiClrUsed; intbiClrImportant; }INFO; typedefstruct { unsignedcharrgbBlue; unsignedcharrgbGreen; unsignedcharrgbRed; unsignedcharrgbReserved; }RGBQUAD; //定义位图类,处理位图 classCBitmap { HEADstrHead;//文件头 INFOstrInfo; RGBQUAD*pRGB; unsignedchar*pData; public: ifstreaminfile; ofstreamoutfile; CBitmap(); ~CBitmap(); voidreadFile(char*); intGetNumberOfColors(); intGetDibWidthBytes(); intGetDibHeightBytes(); voidshuipingjingxiang(); voidchuizhijingxiang(); voidSaveFile(char*szOutfile); }; CBitmap: : CBitmap() { pRGB=NULL; pData=NULL; } CBitmap: : ~CBitmap() { if(pRGB)deletepRGB; if(pData)deletepData; } voidCBitmap: : readFile(char*szInfile) { infile.open(szInfile,ios: : in|ios: : binary); if(! infile) { cout<<"不能打开文件"< return; } //读文件 infile.read((char*)&strHead,sizeof(strHead)); if(strHead.bfType! =0x4d42) {cout<<"该文件不是位图! \n"; return; } //读位图信息头 infile.read((char*)&strInfo,sizeof(strInfo)); cout<<"图像的大小为: 宽度"< cout<<"每个像素使用的位数: "< intnumberOfColors=GetNumberOfColors(); if(numberOfColors==0)//无颜色表 pRGB=NULL; else//有颜色表,读入颜色表 { pRGB=newRGBQUAD[numberOfColors]; infile.read((char*)(pRGB),numberOfColors*sizeof(RGBQUAD)); } //读入位图数据 intDataSize=strInfo.biHeight*GetDibWidthBytes(); pData=newunsignedchar[DataSize]; infile.read((char*)(pData),DataSize); infile.close(); } intCBitmap: : GetNumberOfColors(){ intnumberOfColors; if((strInfo.biClrUsed==0)&& (strInfo.biBitCount<9)) { switch(strInfo.biBitCount) { case1: numberOfColors=2;break; case4: numberOfColors=16;break; case8: numberOfColors=256; } } elsenumberOfColors=(int)strInfo.biClrUsed; returnnumberOfColors; } intCBitmap: : GetDibWidthBytes(){ intbyBitCount=strInfo.biBitCount; intnWidth=strInfo.biWidth; intdwWidthBytes=(int)strInfo.biWidth; if(byBitCount==1)dwWidthBytes=(nWidth+1)/2; elseif(byBitCount==24)dwWidthBytes=3*nWidth; while((dwWidthBytes&3)! =0)dwWidthBytes++; returndwWidthBytes; } intCBitmap: : GetDibHeightBytes(){ intbyBitCount=strInfo.biBitCount; intnHeight=strInfo.biHeight; intdwHeightBytes=(int)strInfo.biHeight; if(byBitCount==1)dwHeightBytes=(nHeight+1)/2; elseif(byBitCount==24)dwHeightBytes=3*nHeight; while((dwHeightBytes&3)! =0)dwHeightBytes++; returndwHeightBytes; } voidCBitmap: : shuipingjingxiang() { for(inti=0;i { for(intj=0;j { if(strInfo.biBitCount==24)//对于24位位图 { unsignedchar*pTemp1=pData+i*GetDibWidthBytes()+3*j; unsignedchar*pTemp2=pData+i*GetDibWidthBytes()+3*(strInfo.biWidth-j-1); unsignedchartemp; temp=*pTemp1,*pTemp1=*pTemp2,*pTemp2=temp; temp=*(pTemp1+1),*(pTemp1+1)=*(pTemp2+1),*(pTemp2+1)=temp; temp=*(pTemp1+2),*(pTemp1+2)=*(pTemp2+2),*(pTemp2+2)=temp; } elseif(strInfo.biBitCount==8)//对于8位位图 { unsignedchar*pTemp1=pData+i*GetDibWidthBytes()+j; unsignedchar*pTemp2=pData+i*GetDibWidthBytes()+(strInfo.biWidth-j-1); unsignedchartemp; temp=*pTemp1,*pTemp1=*pTemp2,*pTemp2=temp; } } } } voidCBitmap: : chuizhijingxiang() { for(inti=0;i { for(intj=0;j { if(strInfo.biBitCount==24)//对于24位位图 { unsignedchar*pTemp1=pData+j*GetDibWidthBytes()+3*i; unsignedchar*pTemp2=pData+(strInfo.biHeight-j-1)*GetDibWidthBytes()+3*i; unsignedchartemp; temp=*pTemp1,*pTemp1=*pTemp2,*pTemp2=temp; temp=*(pTemp1+1),*(pTemp1+1)=*(pTemp2+1),*(pTemp2+1)=temp; temp=*(pTemp1+2),*(pTemp1+2)=*(pTemp2+2),*(pTemp2+2)=temp; } elseif(strInfo.biBitCount==8)//对于8位位图 { unsignedchar*pTemp1=pData+j*GetDibWidthBytes()+i; unsignedchar*pTemp2=pData+(strInfo.biHeight-j-1)*GetDibWidthBytes()+i; unsignedchartemp; temp=*pTemp1,*pTemp1=*pTemp2,*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多媒体 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)