运动估计算法实现_第1页
运动估计算法实现_第2页
运动估计算法实现_第3页
运动估计算法实现_第4页
运动估计算法实现_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、运动估计算法实现一、实验目的:1、掌握运动估计算法的实现原理。在视频编码和处理系统中,运动估计和运动补偿技术对降低视频序列时间冗余度、提高编码效率起着非常关键的作用。运动估计的准确程度将直接决定视频编码器的编码效率。它极大地消除了视频序列的帧间相关性。运动估计算法的复杂性将直接决定视频压缩编码系统的复杂性,如何提高运动估计的效率,使运动估计算法的搜索过程更快速、更高效一直是人们研究的热点。掌握运动估计的块匹配算法,以及快速运动估计算法。2、掌握运动估计算法的研究现状及多种计算方法。3、学习基于块的全搜索运动估计算法,研究分析其Matlab实现程序过程,并补充完成程序,对实验结果进行分析比较。二

2、、实验内容1、 分析基于块匹配的全搜索运动估计算法程序,画出motionEstAnalysis.m文件流程图2、 编程补充完成costFuncMAD.m 文件中最小绝对误差计算函数costFuncMAD()和imgPSNR.m文件中峰值信噪比PSNR计算函数imgPSNR()的程序,最终输出运动矢量场; 3、 掌握运动补偿算法,编程补充minCost( )函数;4、 了解多种快速运动估计算法,例如三步法搜索法、菱形搜索法等。总结实验结果。三、实验原理 在帧间预测编码中,由于活动图像邻近帧中的景物存在着一定的相关性。因此,可将活动图像分成若干块或宏块,并设法搜索出每个块或宏块在邻近帧图像中的位置

3、,并得出两者之间的空间位置的相对偏移量,得到的相对偏移量就是通常所指的运动矢量,得到运动矢量的过程被称为运动估计。 运动矢量和经过运动匹配后得到的预测误差共同发送到解码端,在解码端按照运动矢量指明的位置,从已经解码的邻近参考帧图像中找到相应的块或宏块,和预测误差相加后就得到了块或宏块在当前帧中的位置。 运动估计的准确程度往往用补偿图像与原图像比较的PSNR来衡量表示。四、实验要求1、 对实验程序motionEstAnalysis.m进行分析,完成主程序流程图。函数流程图:2、 编写补充完成部分不全程序代码,调试程序使其能正确运行(1) motionEstAnalysis.m% This scr

4、ipt 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

5、col = size(imgI); % Exhaustive Search %»ùÓÚ¿éµÄÈ«ËÑË÷Ëã·¨ BlockCenter, motionVect, computations = motionEstES(imgP,imgI,mbSize,p); % P Ö¡µ±Ç°Öع¹Í¼

6、07;ñ imgPComp = motionComp(imgI, motionVect, mbSize); % P Ö¡µ±Ç°Í¼ÏñºÍP Ö¡µ±Ç°Öع¹Í¼ÏñµÄPSNRÖµ %ESpsnr(i+1) = imgPSNR(imgP,imgPComp,255); n=255;P

7、SNR=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;

8、 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 Ö¡µ±Ç

9、76;ͼÏñ'); subplot(223);imshow(imagePComp); title('P Ö¡µ±Ç°Öع¹Í¼Ïñ'); subplot(224);imshow(imagePDiff); title('P Ö¡µ±Ç°Öع¹Îó²

10、38;ͼÏñ'); % »­Ô˶¯Ê¸Á¿Í¼ 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; y = 0,row; line(x,y,'Lin

11、eStyle','-','Marker','none'); end for j=mbSize:mbSize:row-mbSize x = 0,col; y = j,j; line(x,y,'LineStyle','-','Marker','none'); end xlabel('X'); ylabel('Y'); (2) motionEstES( )% Computes motion vectors using exhaustive searc

12、h method(全搜索法计算运动矢量)% Input% imgP : The image for which we want to find motion vectors(当前图像)% imgI : The reference image(参考图像)% mbSize : Size of the macroblock(宏块尺寸)% p : Search parameter (read literature to find what this means)(搜索参数)% Ouput% motionVect : the motion vectors for each integral macrob

13、lock in imgP(当前图像中每一个积分宏块的运动矢量)% EScomputations: The average number of points searched for a macroblock(每个宏块搜索的平均点数)% Written by Aroh Barjatyafunction BlockCenter, motionVect, EScomputations = motionEstES(imgP, imgI, mbSize, p) % 定义函数文件motionEstES.m,imgP、 imgI、 mbSize、 p为传入参数,BlockCenter、motionVect、

14、 EScomputations为返回参数row col = size(imgI); % 将参考图像的行数赋值给row,列数赋值给colblockcenter = zeros(2,row*col/mbSize2);vectors = zeros(2,row*col/mbSize2); % 定义全0的矢量矩阵的大小costs = ones(2*p + 1, 2*p +1) * 65537; % 定义最小绝对差矩阵的大小computations = 0; % 搜索点数赋初值为0 % we start off from the top left of the image(从图像左上角开始)% we w

15、ill walk in steps of mbSize(以宏块尺寸为步长)% for every marcoblock that we look at we will look for% a close match p pixels on the left, right, top and bottom of it (对于每一个宏块,在它的上下左右找到与搜索参数p最匹配的像素)mbCount = 1; %搜索的宏块数赋初值为1%1为循环起始值,mbSize为步长值,row-mbSize+1为循环终止值for i = 1 : mbSize : row-mbSize+1 for j = 1 : mb

16、Size : col-mbSize+1 % the exhaustive search starts here(全搜索开始) % we will evaluate cost for (2p + 1) blocks vertically % and (2p + 1) blocks horizontaly(我们将计算水平方向上(2p + 1)个块的最小绝对差和垂直方向上(2p + 1)个块的最小绝对差) % m is row(vertical) index(m为行指数) % n is col(horizontal) index(n为列指数) % this means we are scanning

17、 in raster order for m = -p : p %水平方向上位移矢量范围 for n = -p : p %垂直方向上位移矢量范围 % % row/Vert co-ordinate for ref block (参考块的行(垂直方向)的范围) refBlkVer = i+m; % col/Horizontal co-ordinate(参考块的列(水平方向)的范围) refBlkHor = j+n; %如果参考块的行列范围的任意一个在已经搜索过的宏块之外,则继续下一步的搜索 if ( refBlkVer < 1 | refBlkVer+mbSize-1 > row .

18、| refBlkHor < 1 | refBlkHor+mbSize-1 > col) continue; end costs(m+p+1,n+p+1) = costFuncMAD(imgP(i:i+mbSize-1,j:j+mbSize-1), . imgI(refBlkVer:refBlkVer+mbSize-1, refBlkHor:refBlkHor+mbSize-1), mbSize); % 搜索下一个点 computations = computations + 1; end end % Now we find the vector where the cost is

19、minimum % and store it . this is what will be passed back.(现在找到有最小绝对差的矢量并存储它,这就是将被返回的东西) % blockcenter(1,mbCount) = i+ mbSize/2-1; blockcenter(2,mbCount) = j+ mbSize/2-1; % finds which macroblock in imgI gave us min Cost(找到参考图像中最小绝对差的宏块) dx, dy, min = minCost(costs); % row co-ordinate for the vector

20、(矢量的行集合) vectors(1,mbCount) = dy-p-1; % col co-ordinate for the vector(矢量的列集合) vectors(2,mbCount) = dx-p-1; %搜索下一个宏块 mbCount = mbCount + 1; costs = ones(2*p + 1, 2*p +1) * 65537; endendBlockCenter = blockcenter;motionVect = vectors; %返回当前图像中每一个积分宏块的运动矢量EScomputations = computations/(mbCount - 1); %返

21、回每个宏块搜索的平均点数 (3) costFuncMAD( )% Computes the Mean Absolute Difference (MAD) for the given two blocks(对给定的两个块计算最小绝对差)% Input% currentBlk : The block for which we are finding the MAD(当前块)% refBlk : the block w.r.t. which the MAD is being computed(参考块)% n : the side of the two square blocks% Output% c

22、ost : The MAD for the two blocks(两个块的最小绝对差)% Written by Aroh Barjatya% 定义函数文件costFuncMAD.m,currentBlk、refBlk、 n为传入参数,cost为返回参数function cost = costFuncMAD(currentBlk,refBlk, n) % 补充下面程序cost=sum(sum(abs(currentBlk-refBlk)/(n*n); (4) minCost( )% Finds the indices of the cell that holds the minimum cost

23、(找到拥有最小绝对差的点的指数)% Input% costs : The matrix that contains the estimation costs for a macroblock(包含宏块的估计代价的矩阵)% Output% dx : the motion vector component in columns(列方向上运动矢量组成)% dy : the motion vector component in rows(行方向上运动矢量组成)% Written by Aroh Barjatyafunction dx, dy, min = minCost(costs)row, col

24、= size(costs);% we check whether the current value of costs is less then the already present value in min.% If its inded smaller then we swap the min value with the current one and note the indices.% (检测costs的当前值是否比已经出现的最小值小。如果小的话,我们将当前值与最小值对调,并注明指数)% 补充下面程序minnum=65536;x=8;y=8;for i=1:rowfor j=1:co

25、lif(costs(i,j)<minnum)minnum=costs(i,j);x=i;y=j;endendenddx=x;dy=y;min=minnum; (5) motionComp.m% Computes motion compensated image using the given motion vectors(用给定的运动矢量计算运动补偿图像)% Input % imgI : The reference image (参考图像)% motionVect : The motion vectors(运动矢量)% mbSize : Size of the macroblock(宏块

26、大小)% % Ouput % imgComp : The motion compensated image(运动补偿图像)% Written by ArohBarjatya function imgComp = motionComp(imgI, motionVect, mbSize) row col = size(imgI); % we start off from the top left of the image(从图像左上角开始)% we will walk in steps of mbSize(以宏块大小为步长)% for every marcoblock that we look a

27、t we will read the motion vector(对于看到的每一个宏块,读出它的运动矢量)% and put that macroblock from refernce image in the compensated image(并将参考图像中的该宏块放到补偿图像中)mbCount = 1; for i = 1:mbSize:row-mbSize+1 for j = 1:mbSize:col-mbSize+1 % dy is row(vertical) index(dy为垂直方向上的指数)% dx is col(horizontal) index(dx为水平方向上的指数)% this means we are scanning

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论