视音频课程设计Word下载.docx
《视音频课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《视音频课程设计Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
2、算法源代码。
3、原始图像文件。
4、算法性能分析报告:
主要包括压缩算法的压缩性能(压缩比)以及图像质量的实验计算结果。
5、上机正常运行。
四、成绩考核:
1.课程设计态度(30分)。
2.递交的课程设计报告(60分)。
3、上机运行情况(10分)。
评分按任务项具体要求的基本要求为标准,总分100分。
总成绩折合以五级制成绩计(优秀、良好、中、及格、不及格)。
要求同学们独立完成,发现抄袭的,经查实后以0分计。
五、工作进度:
(共1周)
时间
实践内容
授课地点
指导教师
日期
周次
星期
1.6
19
一
视音频系统方案设计
10-308
张海翔/肖荣
1.7
二
音频信号处理
1.8
三
图像数据处理
1.9
四
视频的预测编码处理
1.10
五
视音频系统整体设计
答辩、考核
《视音频信号处理课程设计》设计报告
目录
一、算法流程设计:
5
二、算法源代码:
三、原始图像文件:
四、算法性能分析:
五、结果分析、结论与体会:
六、参考文献及资料:
视像数据的压缩算法
MPEG-1视像(MPEG-1Video)压缩视像数据的基本方法可以归纳成两个要点
在空间方向上,采用与JPEG类似的算法来去掉空间冗余数据
在时间方向上,采用移动补偿(motioncompensation)算法来去掉时间冗余数据
视像数据结构
把视像片段看成由一系列静态图像(picture)组成的视像序列(sequence)
把视像序列分成许多像组(groupofpicture,GOP)
把像组中的每一帧图像分成许多像片(slice),每个像片由16行组成
把像片分成16行×
16像素/行的宏块(macroblock,MB)
把宏块分成若干个8行×
8像素/行的图块(block)
使用子采样格式为4:
2:
0时,一个宏块由4个亮度(Y)图块和两个色度图块(Cb和Cr)组成
预测图像P的压缩编码算法
算法原理
预测图像P的编码以宏块(MB)为基本编码单元,一个宏块定义为像素的图块,一般取16×
16
预测图像P使用两种类型的参数表示
当前要编码的图像宏块与参考图像的宏块之间的差值
宏块的移动矢量(motionvector,MV)
BMP文件组成
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
1.BMP文件头
BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
2.位图信息头
3.颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。
4.位图数据
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。
具体流程
1.进行主框架的搭建,即main函数的编写,获取视频的帧数及相应的图片,并声明bmp图片的读入和写出的函数、残差计算运动估计函数以及游程编码和解码函数,并在main函数相关位置调用readwrite()函数。
2.bmp图片的读写函数的功能进行编写,在本函数中设立一个switch语句进行用户操作判断,若用户选择压缩操作,则将指定文件读入,并进行运动估计及游程编码的操作,最后将压缩后的信息写在.raw文件中。
3.编写差值计算函数,即diff()函数,在函数中,第一帧图像的残差值为自身,而后的图片的残差图像为当前图像与前一帧图像的差值,
4.将所得到的残差值进行编码,由于残差值有较多的0,则这里使用游程编码,并将结构写入到.raw文件中。
5.编写游程解码函数,通过编码得到的文件中的数据进行解码,得到解码后的bmp图像。
流程图:
压缩操作解压操作退出操作
2、算法源代码:
main函数:
(程序入口)
intmain()
{
intxsize=512;
//图像宽
intysize=257*3;
//图像高
unsignedchar*image;
//用于存放读入的图片
unsignedchar*header;
//记录文件头
image=(unsignedchar*)malloc((size_t)xsize*ysize);
header=(unsignedchar*)malloc(54);
if(image==NULL)
return-1;
if(header==NULL)
readwrite_bmp(image,header,xsize,ysize);
//文件的读入
free(image);
free(header);
return0;
}
Readwrite_bmp函数:
(进行操作判断,压缩操作时读入位图信息)
intreadwrite_bmp(unsignedchar*image,unsignedchar*header,intxsize,intysize)
inti;
intchoice=-1;
FILE*fp,*ifp;
charfname_bmp[20];
unsignedchar*pre;
pre=(unsignedchar*)malloc((size_t)xsize*ysize);
//分配空间
for(i=0;
i<
xsize*ysize;
i++)pre[i]=0;
//初始化
unsignedchar*temp;
temp=(unsignedchar*)malloc((size_t)xsize*ysize);
i++)temp[i]=0;
while(choice)
{
printf("
**********************************************\n"
);
*请选择操作:
*\n"
*1、图像压缩;
*2、图像解压;
*3、退出;
**********************************************\n\n"
scanf("
%d"
&
choice);
switch(choice)
{
case1:
ifp=fopen("
test.rmvb"
"
wb"
for(i=0;
10;
i++)//图像序列
{
sprintf(fname_bmp,"
xj%d.bmp"
i);
//把格式化的数据写入某个字符串中当前文件名
if(!
(fp=fopen(fname_bmp,"
rb"
)))
return-1;
fread(header,sizeof(unsignedchar),54,fp);
//读取文件的header信息
fread(image,sizeof(unsignedchar),(size_t)(long)xsize*ysize,fp);
//读取图片信息存入image数组中
diff(ifp,header,temp,pre,image,xsize,ysize);
//调用运动估计函数
fclose(fp);
}
fclose(ifp);
break;
case2:
runlength_de(pre,temp,header,xsize,ysize);
//解压
case3:
exit(0);
default:
}
}
free(pre);
free(temp);
}
Diff()函数:
(将各图像进行残差计算)
voiddiff(FILE*ifp,unsignedchar*header,unsignedchar*temp,unsignedchar*pre,unsignedchar*now,intxsize,intysize)
inti,j;
unsignedchar*diff;
/*for(i=0;
i<
xsie;
i++)
for(j=0;
j<
ysize;
j++)
for(intk=3;
k>
0;
k--){
for(intm=i-k;
m<
i+k;
m=m+k){
for(intn=j-k;
n<
j+k;
n=n+k){
if(m!
=i||n!
=j){
cnt=
}
}
}
}*/
diff=(unsignedchar*)malloc((size_t)xsize*ysize);
//空间申请
xsize;
i++)
for(j=0;
j<
ysize;
j++)
diff[i*ysize+j]=now[i*ysize+j]-pre[i*ysize+j];
pre[i*ysize+j]=now[i*ysize+j];
//对每张图片计算其残差图像。
首张图片的残差图像为其本身,后续图片的残差图像为当前图像与前一帧图像的差值。
runlength_en(ifp,diff,header,xsize,ysize);
free(diff);
Runlength_en()函数:
(将所得到的残差值进行游程编码)
int