BmotionEstTSS.m
上传用户:cxsjwj
上传日期:2022-08-09
资源大小:34k
文件大小:5k
源码类别:

matlab例程

开发平台:

Matlab

  1. % Computes motion vectors using Three Step Search method
  2. %
  3. % Input
  4. %   imgP : The image for which we want to find motion vectors
  5. %   imgI : The reference image
  6. %   mbSize : Size of the macroblock
  7. %   p : Search parameter  (read literature to find what this means)
  8. %
  9. % Ouput
  10. %   motionVect : the motion vectors for each integral macroblock in imgP
  11. %   TSScomputations: The average number of points searched for a macroblock
  12. %
  13. % Written by Aroh Barjatya
  14. function [motionVect, zeroCount] = BmotionEstTSS(imgP, imgI, mbSize, p)
  15. zeroCount=0;
  16. [row col] = size(imgI);
  17. vectors = zeros(2,row*col/mbSize^2);
  18. costs = ones(3, 3) * 65537;
  19. %computations = 0;
  20. % we now take effectively log to the base 2 of p
  21. % this will give us the number of steps required
  22. L = floor(log10(p+1)/log10(2));   
  23. stepMax = 2^(L-1);
  24. % we start off from the top left of the image
  25. % we will walk in steps of mbSize
  26. % for every marcoblock that we look at we will look for
  27. % a close match p pixels on the left, right, top and bottom of it
  28. mbCount = 1;
  29. for i = 1 : mbSize : row-mbSize+1
  30.     for j = 1 : mbSize : col-mbSize+1
  31.         
  32.         % the three step search starts
  33.         % we will evaluate 9 elements at every step
  34.         % read the literature to find out what the pattern is
  35.         % my variables have been named aptly to reflect their significance
  36.         x = j;
  37.         y = i;
  38.         
  39.         % In order to avoid calculating the center point of the search
  40.         % again and again we always store the value for it from teh
  41.         % previous run. For the first iteration we store this value outside
  42.         % the for loop, but for subsequent iterations we store the cost at
  43.         % the point where we are going to shift our root.
  44.         
  45.         costs(2,2) = costFuncMAD(imgP(i:i+mbSize-1,j:j+mbSize-1),imgI(i:i+mbSize-1,j:j+mbSize-1),mbSize);
  46.         
  47.         %computations = computations + 1;
  48.         stepSize = stepMax;               
  49.         while(stepSize >= 1)  
  50.             % m is row(vertical) index
  51.             % n is col(horizontal) index
  52.             % this means we are scanning in raster order
  53.             for m = -stepSize : stepSize : stepSize        
  54.                 for n = -stepSize : stepSize : stepSize
  55.                     refBlkVer = y + m;   % row/Vert co-ordinate for ref block
  56.                     refBlkHor = x + n;   % col/Horizontal co-ordinate
  57.                     if ( refBlkVer < 1 | refBlkVer+mbSize-1 > row | refBlkHor < 1 | refBlkHor+mbSize-1 > col)
  58.                         continue;
  59.                     end
  60.                     costRow = m/stepSize + 2;
  61.                     costCol = n/stepSize + 2;
  62.                     if (costRow == 2 & costCol == 2)
  63.                         continue
  64.                     end
  65.                     costs(costRow, costCol ) = costFuncMAD(imgP(i:i+mbSize-1,j:j+mbSize-1), ...
  66.                         imgI(refBlkVer:refBlkVer+mbSize-1, refBlkHor:refBlkHor+mbSize-1), mbSize);
  67.                     
  68.                     %computations = computations + 1;
  69.                 end
  70.             end
  71.         
  72.             % Now we find the vector where the cost is minimum
  73.             % and store it ... this is what will be passed back.
  74.         
  75.             [dx, dy, min] = minCost(costs);      % finds which macroblock in imgI gave us min Cost
  76.             
  77.             
  78.             % shift the root for search window to new minima point
  79.             x = x + (dx-2)*stepSize;
  80.             y = y + (dy-2)*stepSize;
  81.             
  82.             % Arohs thought: At this point we can check and see if the
  83.             % shifted co-ordinates are exactly the same as the root
  84.             % co-ordinates of the last step, then we check them against a
  85.             % preset threshold, and ifthe cost is less then that, than we
  86.             % can exit from teh loop right here. This way we can save more
  87.             % computations. However, as this is not implemented in the
  88.             % paper I am modeling, I am not incorporating this test. 
  89.             % May be later...as my own addition to the algorithm
  90.             
  91.             stepSize = stepSize / 2;
  92.             costs(2,2) = costs(dy,dx);
  93.             
  94.         end
  95.         vectors(1,mbCount) = y - i;    % row co-ordinate for the vector
  96.         vectors(2,mbCount) = x - j;    % col co-ordinate for the vector            
  97.         mbCount = mbCount + 1;
  98.         costs = ones(3,3) * 65537;
  99.     end
  100. end
  101. motionVect = vectors;
  102. sizeVect=size(motionVect);
  103. for i=1:sizeVect(2)
  104.     if motionVect(1,i)==0 & motionVect(2,i)==0
  105.         zeroCount=zeroCount+1;
  106.     end
  107. end
  108. %TSScomputations = computations/(mbCount - 1);
  109.