数字视频实验一、二.doc
《数字视频实验一、二.doc》由会员分享,可在线阅读,更多相关《数字视频实验一、二.doc(9页珍藏版)》请在冰点文库上搜索。
实验一:
读取YUV视频文件学时安排:
2
实验类别:
课内实验
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
一、实验目的和任务
熟悉MATLAB软件开发环境,了解YUV色彩模型,编写MATLAB程序读取YUV格式视频文件及各分量数据。
二、实验原理
利用MATLAB图像处理工具箱中的函数,在MATLAB编程环境下,实现YUV序列图像及各分量数据的读取。
三、实验内容和步骤
1. 运行MATLAB集成开发环境,编写MATLAB程序读取YUV视频文件,对YUV各分量进行提取、观察和比较。
2. 编写RGB和YUV视频文件转换程序
3. 课后撰写实验报告。
(—)读取YUV格式视频并提取分量
1)读取YUV格式文件
程序如下:
%¶ÁÈ¡YUV¸ñʽÎļþÐÅÏ¢
functionYUV_ReadShow(filename,frameNumMax,formatT)
ifnargin==0
frameNumMax=100;
formatT='qcif';%yuv¸ñʽÎļþÀàÐÍ
filename='C:
\DocumentsandSettings\Administrator\×ÀÃæ\akiyo_qcif.yuv';%'foreman.qcif';%YUV¸ñʽÎļþ
end
%³õʼ»¯Ö¡¸ñʽ
switchformatT
case'qcif'
H=144;%¸ß
W=176;%¿í
case'cif'
H=288;%¸ß
W=352;%¿í
otherwise
H=480;%¸ß
W=720;%¿í
end
forframeNum=1:
frameNumMax;
%¶ÁÈ¡YUV¸ñʽÎļþÄÚÈÝ
[Y,U,V]=yuv_import(filename,[W,H],1,frameNum);
tmp=Y{1};
%ÏÔʾYUV¸ñʽµÄͼƬ
img1=zeros(H+H/2,W);
img1(1:
H,:
)=Y{1};
img1(H+1:
end,1:
W/2)=V{1};
img1(H+1:
end,W/2+1:
end)=U{1};
subplot(121),imshow(uint8(img1));
pause(1/30);%ÔÝÍ£ÒÔÏÔʾÊÓƵ¶¯»
end
%YUV¸ñʽµÄͼƬװÔØ
function[Y,U,V]=yuv_import(filename,dims,numfrm,startfrm)
fid=fopen(filename,'r');
if(fid<0)
error('Filedoesnotexist!
');
end;
Yd=zeros(dims
(1),dims
(2));
UVd=zeros(dims
(1)/2,dims
(2)/2);%UV·ÖÁ¿µÄλÖÃ
frelem=numel(Yd)+2*numel(UVd);%ÊÓƵͼÏñÏÔʾµÄ¿í¶È
if(nargin==4)%gotothestartingframe
fseek(fid,startfrm*frelem,0);
end;
Y=cell(1,numfrm);
U=cell(1,numfrm);
V=cell(1,numfrm);
fori=1:
numfrm
Yd=fread(fid,[dims
(1)dims
(2)],'uint8');
Y{i}=Yd';%תÖÃ
UVd=fread(fid,[dims
(1)/2dims
(2)/2],'uint8');
U{i}=UVd';
UVd=fread(fid,[dims
(1)/2dims
(2)/2],'uint8');
V{i}=UVd';
end;
fclose(fid);
结果如下:
2)分量提取
程序如下:
%读取YUV格式视频程序
functionyuv
[fname,pname]=uigetfile('*.yuv;*.jqcif');%获得文件路径
FileName=fullfile(pname,fname);%选择文件
FileLength=length(FileName);%获取文件名长度
%判断打开的是YUV格式视频还是QCIF格式图片,并设置相应的像素大小
if(FileName(FileLength-2:
1:
FileLength)=='yuv')
wide=176*2;
high=144*2;
end
if(FileName(FileLength-3:
1:
FileLength)=='qcif')
wide=176;
high=144;
end
File=fopen(FileName);%打开文件
framenumber=input('读取第几帧:
');
%从第framenumber帧开始读取数据
fseek(File,(framenumber-1)*high*wide*3/2,'bof');
%读取相应分量数据
Y=double(fread(File,[wide,high],'uint8'))';
U=double(fread(File,[wide/2,high/2],'uint8'))';
V=double(fread(File,[wide/2,high/2],'uint8'))';
%显示YUV各图像分量
figure
(1);
subplot(2,2,1)
imshow(uint8(Y));
title(['第'num2str(framenumber)'帧Y分量图']);
subplot(2,2,2)
imshow(uint8(U));
title(['第'num2str(framenumber)'帧U分量图']);
subplot(2,2,3)
imshow(uint8(V));
title(['第'num2str(framenumber)'帧V分量图']);
实验结果:
(二)YUV与RGB互相转换
程序如下:
%YUV格式与RGB格式视频相互转换程序
functionrgb
[fname,pname]=uigetfile('*.yuv;*.jqcif');%获得文件路径
FileName=fullfile(pname,fname);%选择文件
FileLength=length(FileName);%获取文件名长度
%判断打开的是YUV格式视频还是QCIF格式图片,并设置相应的像素大小
if(FileName(FileLength-2:
1:
FileLength)=='yuv')
wide=176*2;
high=144*2;
end
if(FileName(FileLength-3:
1:
FileLength)=='qcif')
wide=176;
high=144;
end
File=fopen(FileName);%打开文件
picture=zeros(1.5*high,wide);
framenumber=input('读取第几帧:
');
%从第framenumber帧开始读取数据
fseek(File,(framenumber-1)*high*wide*3/2,'bof');
%读取相应分量数据
Y=double(fread(File,[wide,high],'uint8'))';
U=double(fread(File,[wide/2,high/2],'uint8'))';
V=double(fread(File,[wide/2,high/2],'uint8'))';
%将YUV三分量图像拼接成一幅图片
picture(1:
high,1:
wide)=Y;
picture(high+1:
1.5*high,1:
wide/2)=U;
picture(high+1:
1.5*high,wide/2+1:
wide)=V;
Y1(1:
high/2,1:
wide/2)=Y(1:
2:
high,1:
2:
wide);%将Y分量图像缩小一半
%将YUV各分量图像通过公式转换为RGB各分量
R=Y1+1.14*(V-128);
G=Y1-0.39*(U-128)-0.58*(V-128);
B=Y1+2.03*(U-128);
%将R,G,B各分量合成RGB图像
picture1=zeros(high/2,wide/2,3);
picture1(:
:
1)=R;
picture1(:
:
2)=G;
picture1(:
:
3)=B;
RGB=uint8(cat(3,R,G,B));
%图像结果显示
figure
(1);
subplot(1,2,1);
imshow(uint8(picture));
title(['第'num2str(framenumber)'帧YUV格式图像各分量图']);
subplot(1,2,2);
imshow(RGB);
title(['第'num2str(framenumber)'帧转换为RGB图像显示']);
结果如下:
四、注意事项和要求
预先复习预习MATLAB图像编程知识,复习视频文件格式和各种格式转换原理。
五、参考书目
数字视频技术教材。
实验二:
序列图像的运动估计实验学时安排:
2
实验类别:
课内实验
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
一、实验目的和任务
进一步熟悉MATLAB软件开发环境。
学习在MATLAB编程环境下实现对标准序列图像的前后两帧图像间进行运动估计,并统计得到的运动矢量。
二、实验原理
利用MATLAB图像处理工具箱中的函数,在MATLAB编程环境下,用穷尽块匹配算法实现序列图像的帧间运动估计。
三、实验内容和步骤
1. 将标准序列图像的前后两帧图像文件存入计算机,运行MATLAB集成开发环境。
2. 编程实现序列图像的整象素精度穷尽块匹配算法。
3. 课后撰写实验报告。
程序如下:
clear;
closeall;
clc;
%装入图像
A=imread('C:
\DocumentsandSettings\Administrator\桌面\1.bmp');%读入图像
B=imread('C:
\DocumentsandSettings\Administrator\桌面\2.bmp');
f2=rgb2gray(A);%将图像转换成灰度图像
f1=rgb2gray(B);%将图像转换成灰度图像
fp=0;
figure,imshow(f2),title('目标帧');
figure,imshow(f1),title('锚定帧')
N=16;R=16;
height=256;
width=256;
fori=1:
N:
height-N+1
forj=1:
N:
width-N+1
MAD_min=256*N*N;
dy=0;dx=0;
fork=-R:
1:
R,
forl=-R:
1:
R
ifi+k<1
MAD=256*N*N;
elseifi+k>height-N
MAD=256*N*N;
elseifj+l<1
MAD=256*N*N;
elseifj+l>width-N
MAD=256*N*N;
else
MAD=sum(sum(abs(double(f1(i:
i+N-1,j:
j+N-1))-double(f2(i+k:
i+k+N-1,j+l:
j+l+N-1)))));
end
ifMADMAD_min=MAD;
dy=k;dx=l;
end;end;end;
fp(i:
i+N-1,j:
j+N-1)=f2(i+dy:
i+dy+N-1,j+dx:
j+dx+N-1);
iblk=floor((i-1)/N+1);jblk=floor((j-1)/N+1);
mvx(iblk,jblk)=dx;
mvy(iblk,jblk)=dy;
end;end;
figure,imshow(uint8(fp)),title('预测帧');
[X,Y]=meshgrid(N/2:
N:
256-N/2);
Y=256-Y;
figure,quiver(X,Y,mvx,mvy),title('整像素精度的运动场');
diff=abs(double(f1)-fp);
figure,imshow(uint8(diff)),title('diff');
PSNR=20*log10(255)+20*log10(256)-10*log10(sum(sum(diff.*diff)));
试验结果如下:
四、注意事项和要求
预习MATLAB图像编程知识,复习序列图像的整象素精度穷尽块匹配算法原理。
五、参考书目
数字视频技术教材。