《数字视频实验一、二.doc》由会员分享,可在线阅读,更多相关《数字视频实验一、二.doc(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验一:读取YUV视频文件 学时安排:2 实验类别:课内实验 一、实验目的和任务熟悉MATLAB软件开发环境,了解YUV色彩模型,编写MATLAB程序读取YUV格式视频文件及各分量数据。二、实验原理利用MATLAB图像处理工具箱中的函数,在MATLAB编程环境下,实现YUV序列图像及各分量数据的读取。三、实验内容和步骤1 运行MATLAB集成开发环境, 编写MATLAB程序读取YUV视频文件,对YUV各分量进行提取、观察和比较。2 编写RGB和YUV视频文件转换程序3 课后撰写实验报告。()读取YUV格式视频并提取分量1)读取YUV格式文件程序如下:%YUVfunction YUV_ReadS
2、how()if nargin=0 frameNumMax = 100; formatT = qcif; %yuv = C:Documents and SettingsAdministratorakiyo_qcif.yuv;%foreman.qcif;%YUVend% switch formatT case qcif H = 144; % W = 176; % case cif H = 288; % W = 352;% otherwise H = 480;% W = 720;% endfor frameNum = 1:frameNumMax;% YUVY,U,V=yuv_import(,W,H,
3、1,frameNum);tmp = Y1; % YUV img1 = zeros(H+H/2,W);img1(1:H,:) = Y1;img1(H+1:end,1:W/2) = V1;img1(H+1:end,W/2+1:end) = U1;subplot(121),imshow(uint8(img1);pause(1/30); % end%YUVfunction Y,U,V=yuv_import()fid=fopen(,r);if (fid 0) error( not exist!);end;Yd = zeros(dims(1),dims(2);UVd = zeros(dims(1)/2,d
4、ims(2)/2);%UVfrelem = numel(Yd) + 2*numel(UVd); %if (nargin = 4) %go to the starting frame fseek(fid,startfrm * frelem , 0);end;Y = cell(1,numfrm);U = cell(1,numfrm);V = cell(1,numfrm);for i=1:numfrmYd = fread(fid,dims(1) dims(2),uint8); Yi = Yd;%UVd = fread(fid,dims(1)/2 dims(2)/2,uint8); Ui = UVd;
5、 UVd = fread(fid,dims(1)/2 dims(2)/2,uint8);Vi = UVd;end;fclose(fid); 结果如下:2)分量提取程序如下:%读取YUV格式视频程序function yuvfname,pname=uigetfile(*.yuv;*.jqcif);%获得文件路径 (pname,fname); %选择文件();%获取文件名长度%判断打开的是YUV格式视频还是QCIF格式图片,并设置相应的像素大小if()=yuv) wide=176*2; high=144*2;endif()=qcif) wide=176; high=144;end();%打开文件fr
6、amenumber=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) 帧
7、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格式视频相互转换程序function rgbfname,pname=uigetfile(*.yuv;*.jqcif );%获得文件路径 (pname,fname); %选择文件();%获取文件名长度%判断打开的是YUV格式视频还是QCIF格式图片,并设置相
8、应的像素大小if()=yuv) wide=176*2; high=144*2;endif()=qcif) wide=176; high=144;end();%打开文件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
9、(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.0
10、3*(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图像显示
11、);结果如下:四、注意事项和要求预先复习预习MATLAB图像编程知识,复习视频文件格式和各种格式转换原理。五、参考书目数字视频技术教材。实验二:序列图像的运动估计实验 学时安排:2 实验类别:课内实验 一、实验目的和任务进一步熟悉MATLAB软件开发环境。学习在MATLAB编程环境下实现对标准序列图像的前后两帧图像间进行运动估计,并统计得到的运动矢量。二、实验原理利用MATLAB图像处理工具箱中的函数,在MATLAB编程环境下,用穷尽块匹配算法实现序列图像的帧间运动估计。三、实验内容和步骤1 将标准序列图像的前后两帧图像文件存入计算机,运行MATLAB集成开发环境。2 编程实现序列图像的整象素
12、精度穷尽块匹配算法。3 课后撰写实验报告。程序如下:clear;close all;clc;%装入图像A=imread(C:Documents and SettingsAdministrator桌面1.bmp);%读入图像B=imread(C:Documents and SettingsAdministrator桌面2.bmp);f2=rgb2gray(A);%将图像转换成灰度图像f1=rgb2gray(B);%将图像转换成灰度图像fp=0;figure,imshow(f2),title(目标帧);figure,imshow(f1),title(锚定帧)N=16;R=16;height=256
13、;width=256;for i=1:N:height-N+1for j=1:N:width-N+1 MAD_min=256*N*N;dy=0;dx=0;for k= -R:1:R,for l= -R:1:R if i+kheight-N MAD=256*N*N; elseif j+lwidth-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); endif MADMAD_minMAD_min=MAD;dy=k;dx=l;end;end;end;fp
14、(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图像编程知识,复习序列图像的整象素精度穷尽块匹配算法原理。五、参考书目数字视频技术教材。