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

matlab例程

开发平台:

Matlab

  1. % Computes motion vectors using Adaptive Rood Pattern Search method
  2. %
  3. % Based on the paper by Yao Nie, and Kai-Kuang Ma
  4. % IEEE Trans. on Image Processing
  5. % Volume 11 Number 12, December 2002 :  Pages 1442:1448
  6. %
  7. % Input
  8. %   imgP : The image for which we want to find motion vectors
  9. %   imgI : The reference image
  10. %   mbSize : Size of the macroblock
  11. %   p : Search parameter  (read literature to find what this means)
  12. %
  13. % Ouput
  14. %   motionVect : the motion vectors for each integral macroblock in imgP
  15. %   ARPScomputations: The average number of points searched for a macroblock
  16. %
  17. % Written by Aroh Barjatya
  18. function [motionVect, zeroCount] = BmotionEstARPS(imgP, imgI, mbSize, p)
  19. zeroCount=0;
  20. [row col] = size(imgI);
  21. vectors = zeros(2,row*col/mbSize^2);
  22. costs = ones(1, 6) * 65537;
  23. % The index points for Small Diamond search pattern
  24. SDSP(1,:) = [ 0 -1];
  25. SDSP(2,:) = [-1  0];
  26. SDSP(3,:) = [ 0  0];
  27. SDSP(4,:) = [ 1  0];
  28. SDSP(5,:) = [ 0  1];
  29. % We will be storing the positions of points where the checking has been
  30. % already done in a matrix that is initialised to zero. As one point is
  31. % checked, we set the corresponding element in the matrix to one. 
  32. checkMatrix = zeros(2*p+1,2*p+1);
  33. % computations = 0;
  34. % we start off from the top left of the image
  35. % we will walk in steps of mbSize
  36. % mbCount will keep track of how many blocks we have evaluated
  37. mbCount = 1;
  38. for i = 1 : mbSize : row-mbSize+1
  39.     for j = 1 : mbSize : col-mbSize+1
  40.         
  41.         % the Adapive Rood Pattern search starts
  42.         % we are scanning in raster order
  43.         
  44.         x = j;
  45.         y = i;
  46.         
  47.         costs(3) = costFuncMAD(imgP(i:i+mbSize-1,j:j+mbSize-1), ...
  48.                                     imgI(i:i+mbSize-1,j:j+mbSize-1),mbSize);
  49.         
  50.         checkMatrix(p+1,p+1) = 1;
  51. %         computations =  computations + 1; 
  52.         % if we are in the left most column then we have to make sure that
  53.         % we just do the LDSP with stepSize = 2
  54.         if (j-1 < 1)
  55.             stepSize = 2;
  56.             maxIndex = 5;
  57.         else 
  58.             stepSize = max(abs(vectors(1,mbCount-1)), abs(vectors(2,mbCount-1)));
  59.             % now we have to make sure that if the point due to motion
  60.             % vector is one of the LDSP points then we dont calculate it
  61.             % again
  62.             if ( (abs(vectors(1,mbCount-1)) == stepSize & vectors(2,mbCount-1) == 0) ...
  63.                  | (abs(vectors(2,mbCount-1)) == stepSize & vectors(1,mbCount-1) == 0)) ...
  64.                  
  65.                 maxIndex = 5; % we just have to check at the rood pattern 5 points
  66.                 
  67.             else
  68.                 maxIndex = 6; % we have to check 6 points
  69.                 LDSP(6,:) = [ vectors(2, mbCount-1)  vectors(1, mbCount-1)];
  70.             end
  71.         end
  72.         
  73.         % The index points for first and only Large Diamond search pattern
  74.         
  75.         LDSP(1,:) = [ 0 -stepSize];
  76.         LDSP(2,:) = [-stepSize 0]; 
  77.         LDSP(3,:) = [ 0  0];
  78.         LDSP(4,:) = [stepSize  0];
  79.         LDSP(5,:) = [ 0  stepSize];
  80.         
  81.         
  82.         % do the LDSP
  83.         
  84.         
  85.         for k = 1:maxIndex
  86.             refBlkVer = y + LDSP(k,2);   % row/Vert co-ordinate for ref block
  87.             refBlkHor = x + LDSP(k,1);   % col/Horizontal co-ordinate
  88.             if ( refBlkVer < 1 | refBlkVer+mbSize-1 > row ...
  89.                  | refBlkHor < 1 | refBlkHor+mbSize-1 > col)
  90.              
  91.                 continue; % outside image boundary
  92.             end
  93.             if (k == 3 | stepSize == 0)
  94.                 continue; % center point already calculated
  95.             end
  96.             costs(k) = costFuncMAD(imgP(i:i+mbSize-1,j:j+mbSize-1), ...
  97.                   imgI(refBlkVer:refBlkVer+mbSize-1, refBlkHor:refBlkHor+mbSize-1), mbSize);
  98. %             computations =  computations + 1;
  99.             checkMatrix(LDSP(k,2) + p+1, LDSP(k,1) + p+1) = 1;
  100.             
  101.         end
  102.         
  103.         [cost, point] = min(costs);
  104.         
  105.         
  106.         % The doneFlag is set to 1 when the minimum
  107.         % is at the center of the diamond           
  108.         x = x + LDSP(point, 1);
  109.         y = y + LDSP(point, 2);
  110.         costs = ones(1,5) * 65537;
  111.         costs(3) = cost;
  112.        
  113.         doneFlag = 0;   
  114.         while (doneFlag == 0)
  115.             for k = 1:5
  116.                 refBlkVer = y + SDSP(k,2);   % row/Vert co-ordinate for ref block
  117.                 refBlkHor = x + SDSP(k,1);   % col/Horizontal co-ordinate
  118.                 if ( refBlkVer < 1 | refBlkVer+mbSize-1 > row ...
  119.                       | refBlkHor < 1 | refBlkHor+mbSize-1 > col)
  120.                       continue;
  121.                 end
  122.                 if (k == 3)
  123.                     continue
  124.                 elseif (refBlkHor < j-p | refBlkHor > j+p | refBlkVer < i-p ...
  125.                             | refBlkVer > i+p)
  126.                         continue;
  127.                 elseif (checkMatrix(y-i+SDSP(k,2)+p+1 , x-j+SDSP(k,1)+p+1) == 1)
  128.                     continue
  129.                 end
  130.             
  131.                 costs(k) = costFuncMAD(imgP(i:i+mbSize-1,j:j+mbSize-1), ...
  132.                              imgI(refBlkVer:refBlkVer+mbSize-1, ...
  133.                                  refBlkHor:refBlkHor+mbSize-1), mbSize);
  134.                 checkMatrix(y-i+SDSP(k,2)+p+1, x-j+SDSP(k,1)+p+1) = 1;
  135. %                 computations =  computations + 1;
  136.                 
  137.   
  138.             end
  139.             
  140.             [cost, point] = min(costs);
  141.            
  142.             if (point == 3)
  143.                 doneFlag = 1;
  144.             else
  145.                 x = x + SDSP(point, 1);
  146.                 y = y + SDSP(point, 2);
  147.                 costs = ones(1,5) * 65537;
  148.                 costs(3) = cost;
  149.             end
  150.             
  151.         end  % while loop ends here
  152.         
  153.         vectors(1,mbCount) = y - i;    % row co-ordinate for the vector
  154.         vectors(2,mbCount) = x - j;    % col co-ordinate for the vector            
  155.         mbCount = mbCount + 1;
  156.         costs = ones(1,6) * 65537;
  157.         
  158.         checkMatrix = zeros(2*p+1,2*p+1);
  159.     end
  160. end
  161.     
  162. motionVect = vectors;
  163. %ARPScomputations = computations/(mbCount-1) ; 
  164. sizeVect=size(motionVect);
  165. for i=1:sizeVect(2)
  166.     if motionVect(1,i)==0 & motionVect(2,i)==0
  167.         zeroCount=zeroCount+1;
  168.     end
  169. end    
  170.     
  171.