运动估计算法实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运动估计算法实现
一、实验目的:
1、掌握运动估计算法的实现原理。
在视频编码和处理系统中,运动估计和运动补偿技术对降低视频序列时间冗余度、提高编码效率起着非常关键的作用。运动估计的准确程度将直接决定视频编码器的编码效率。它极大地消除了视频序列的帧间相关性。运动估计算法的复杂性将直接决定视频压缩编码系统的复杂性,如何提高运动估计的效率,使运动估计算法的搜索过程更快速、更高效一直是人们研究的热点。掌握运动估计的块匹配算法,以及快速运动估计算法。
2、掌握运动估计算法的研究现状及多种计算方法。
3、学习基于块的全搜索运动估计算法,研究分析其Matlab实现
程序过程,并补充完成程序,对实验结果进行分析比较。
二、实验内容
1、分析基于块匹配的全搜索运动估计算法程序,画出
motionEstAnalysis.m文件流程图
2、编程补充完成costFuncMAD.m 文件中最小绝对误差计算函数
costFuncMAD()和imgPSNR.m文件中峰值信噪比PSNR计算函数
imgPSNR()的程序,最终输出运动矢量场;
3、掌握运动补偿算法,编程补充minCost( )函数;
4、了解多种快速运动估计算法,例如三步法搜索法、菱形搜索法等。总结实验结果。
三、实验原理
在帧间预测编码中,由于活动图像邻近帧中的景物存在着一定的相关性。因此,可将活动图像分成若干块或宏块,并设法搜索出每个块或宏块在邻近帧图像中的位置,并得出两者之间的空间位置的相对偏移量,得到的相对偏移量就是通常所指的运动矢量,得到运动矢量的过程被称为运动估计。
运动矢量和经过运动匹配后得到的预测误差共同发送到解码端,在解码端按照运动矢量指明的位置,从已经解码的邻近参考帧图像中找到相应的块或宏块,和预测误差相加后就得到了块或宏块在当前帧中的位置。
运动估计的准确程度往往用补偿图像与原图像比较的PSNR来衡量表示。
四、实验要求
1、对实验程序motionEstAnalysis.m进行分析,完成主程序流程图。
函数流程图:
2、编写补充完成部分不全程序代码,调试程序使其能正确运行
(1)motionEstAnalysis.m
% This script uses all the Motion Estimation algorithms written for the % final project and save their results.
close all
clear all
% imageName = 'caltrain.avi';
mbSize = 4;
p = 7;
imgP1=double(imread('imagP.bmp'));
imgI1=double(imread('imagI.bmp'));
imgP=imgP1(:,:,1);
imgI=imgI1(:,:,1);
[row col] = size(imgI);
% Exhaustive Search
%»ùÓÚ¿éµÄÈ«ËÑË÷Ëã·¨
[BlockCenter, motionVect, computations] = motionEstES(imgP,imgI,mbSize,p);
% P Ö¡µ±Ç°Öع¹Í¼Ïñ
imgPComp = motionComp(imgI, motionVect, mbSize);
% P Ö¡µ±Ç°Í¼ÏñºÍP Ö¡µ±Ç°Öع¹Í¼ÏñµÄPSNRÖµ
%ESpsnr(i+1) = imgPSNR(imgP,imgPComp,255);
n=255;
PSNR=imgPSNR(imgP,imgPComp,255)
%MSE=(1/(n*n))*sum(sum((imgP-imgPComp).^2));
%PSNR=10*log(max(max(imgPComp)).^2/MSE);
%psnr=PSNR;
%EScomputations(i+1) = computations;
% P Ö¡µ±Ç°Öع¹Îó²îͼÏñ
imagePDiff = imgP - imgPComp;
figure;
imageI = uint8(imgI);
imageP = uint8(imgP);
imagePComp = uint8(imgPComp);
imagePDiff = uint8(imagePDiff);
subplot(221);imshow(imageI);
title('I Ö¡²Î¿¼Í¼Ïñ');
subplot(222);imshow(imageP);
title('P Ö¡µ±Ç°Í¼Ïñ');
subplot(223);imshow(imagePComp);
title('P Ö¡µ±Ç°Öع¹Í¼Ïñ');
subplot(224);imshow(imagePDiff);
title('P Ö¡µ±Ç°Öع¹Îó²îͼÏñ');
% »-Ô˶¯Ê¸Á¿Í¼
figure;
quiver( BlockCenter(2,:), BlockCenter(1,:), motionVect(2,:), motionVect(1,:), .2,'r');
axis([0 320 0 240]);
for i=mbSize:mbSize:col-mbSize
x = [i,i];