⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packmatch.m

📁 运动估计经典算法 matlab程序
💻 M
字号:
function[mi,mj,count]=PackMatch(a,b,pi,pj,method)        % 进行运动搜索块匹配
% a是前一桢,b是当前桢
% pi,pj是被匹配块的第一个像素的位置
% mi,mj是结果块的第一个像素的位置
% method 搜索方法  
% 1:全搜索
% 2:3步法
% 3:4步法
% 4:菱形法
% 5:对数搜索法

M=144;  %水平144个像素
N=176;  %垂直176个像素
framesize=M*N;  %图像总像素数176*144
blocksize=8;    %分块的大小为:8*8
bs=8;
vnum=M/blocksize;   %水平可以分的块数:144/8=18
hnum=N/blocksize;   %垂直可以分的块数:176/8=22 
count=0;
min=10000000;   %设定比较值的大小
mi=1;
mj=1;
matchok=zeros(M,N);       % 标记是否已经搜索过

switch method
%------------------------------1:全搜索法--------------------------------%          
    case 1
		w=7;   %向左向右最多移7个像素 
		for i=pi-w:pi+w   %水平移动:原图像位置向左7个像素至向右7个像素
            for j=pj-w:pj+w   %垂直移动:原图像位置向左7个像素至向右7个像素
                if i>0 & j>0 & i+w<=M & j+w<=N  %寻找范围不能超过原图片格式大小  
                    mse=sum(sum((b(pi:pi+bs-1,pj:pj+bs-1)-a(i:i+bs-1,j:j+bs-1)).^2));
                    count=count+1;
                  if mse<=min   %满足条件就记录坐标,确定其位置
                       min=mse;
                       mi=i;
                       mj=j;
                  end 
               end
            end
        end
%---------------------------2:三步法------------------------------------%
case 2
    step=4;          %第一步搜索步长为4
  while step>=1  
        for i=pi-step:step:pi+step        
            for j=pj-step:step:pj+step       %搜索对象为周围9个点
                if i>0 & j>0 & i+bs-1<=M & j+bs-1<=N         %寻找范围不能超过原图片格式大小
                   if matchok(i,j)==0
                      mse=sum(sum((b(pi:pi+bs-1,pj:pj+bs-1)-a(i:i+bs-1,j:j+bs-1)).^2));
                      count=count+1;
                      matchok(i,j)=1;
                      if mse<=min      %满足条件就记录坐标,确定其位置
                         min=mse;
                         mi=i;
                         mj=j;
                      end
                  end
               end
           end
      end
      step=step/2;
  end
%---------------------------3:四步法---------------------------------------%
case 3
     step=2;
    while step>=1
        for i=pi-step:step:pi+step
            for j=pj-step:step:pj+step
                if i>0&j>0&i+bs<=M&j+bs<=N
                   if matchok(i,j)~=1
                      mse=sum(sum((b(pi:pi+bs-1,pj:pj+bs-1)-a(i:i+bs-1,j:j+bs-1)).^2));
                      count=count+1;
                      matchok(i,j)=1;
                      if mse<=min   
                         min=mse;
                         mi=i;   
                         mj=j;
                     end
                 end
             end
         end
     end
     if step==1
         break
     end
     if pi==mi&pj==mj
        step=step/2;
    end
    pi=mi;pj=mj;
end
%----------------------------4:菱形法-----------------------------------%
case 4
    w=7;
    step=2;
    while step>=1
        for i=pi-step:pi+step
            for j=pj+abs(i-pi)-step:step:pj+abs(i-pi)+step
                if i>0&j>0&i+bs<=M&j+bs<=N
                   if matchok(i,j)~=1
                      mse=sum(sum((b(pi:pi+bs-1,pj:pj+bs-1)-a(i:i+bs-1,j:j+bs-1)).^2));
                      count=count+1;
                      matchok(i,j)=1;
                      if mse<=min   
                         min=mse;
                         mi=i;   
                         mj=j;
                     end
                 end
             end
         end
     end
     if step==1
         break
     end
     if pi==mi&pj==mj
        step=step/2;
    end
    pi=mi;pj=mj;
end
%------------------------------5:对数搜索法--------------------------------%
case 5
  w=2;   %初始化步长
  ci=pi;  %搜索块中初始化定位
  cj=pj;
  position=[0 1 0;1 1 1;0 1 0];  %确定搜索的点的位置
  while w>=1
      for i=-1:1
         for j=-1:1
              if ci+i*w>0 & ci+i*w+blocksize-1<=M & cj+j*w>0 & cj+j*w+blocksize-1<=N & position(i+2,j+2)==1 & matchok(ci+i*w,cj+j*w)==0
                 mse=sum(sum((b(pi:pi+bs-1,pj:pj+bs-1)-a(ci+i*w:ci+i*w+bs-1,cj+j*w:cj+j*w+bs-1)).^2));
                  count=count+1;
                 matchok(ci+i*w,cj+j*w)==1; %标记是否搜索过
                  if mse<=min
                       min=mse;
                      tempi=i;
                      tempj=j;
                   end
              end
           end
       end
    if tempi==0 & tempj==0
         w=w/2;
      position=[1 1 1;1 1 1;1 1 1];
     end
     ci=ci+tempi*w;
     cj=cj+tempj*w;
 end        
  mi=ci;
  mj=cj;
 %------------------------------6:交叉搜索法--------------------------------% 
case 6
  w=4;
  ci=pi;
  cj=pj;   
     position=[1 0 1;0 1 0;1 0 1];
     position1=[0 1 0;1 0 1;0 1 0];
  while w>=1
            tempi=ci;
            tempj=cj;
            for i=-1:1
                for j=-1:1
             if ci+i*w>0 & ci+i*w+blocksize-1<=M & cj+j*w>0 & cj+j*w+blocksize-1<=N & position(i+2,j+2) & matchok(ci+i*w,cj+j*w)==0   %判断是否出界
                          mse=sum(sum((b(pi:pi+bs-1,pj:pj+bs-1)-a(ci+i*w:ci+i*w+bs-1,cj+j*w:cj+j*w+bs-1)).^2));
                          count=count+1;
                       matchok(ci+i*w,cj+j*w)=1;
                        if mse<=min
                           min=mse;
                           tempi=ci+i*w;
                           tempj=cj+j*w;
                        end
                    end
                end
            end
            ci=tempi;
            cj=tempj;
            w=w/2;
  end
        
 ci=tempi;
 cj=tempj;
   w=1;
 if ci~=1 | ci~=M |cj~=1 | cj~=N
     ;
 elseif matchok(ci-w,cj-w)==1 |  matchok(ci+w,cj+w)==1
     for i=-1:2:1
         for j=-1:2:1
             if ci+i*w>0 & ci+i*w+blocksize-1<=M & cj+j*w>0 & cj+j*w+blocksize-1<=N & matchok(ci+i*w,cj+j*w)==0
                mse=sum(sum((b(pi:pi+bs-1,pj:pj+bs-1)-a(ci+i*w:ci+i*w+bs-1,cj+j*w:cj+j*w+bs-1)).^2));  
                count=count+1;
                   matchok(ci+i*w,cj+j*w)=1;
             if mse<=min
                min=mse;
          tempi=ci+i*w;
          tempj=cj+j*w; 
           end
        end
      end
   end
else 
    for i=-1:1
         for j=-1:1
             if ci+i*w>0 & ci+i*w+blocksize-1<=M & cj+j*w>0 & cj+j*w+blocksize-1<=N & position1(i+2,j+2)==1  & matchok(ci+i*w,cj+j*w)==0
                mse=sum(sum((b(pi:pi+bs-1,pj:pj+bs-1)-a(ci+i*w:ci+i*w+bs-1,cj+j*w:cj+j*w+bs-1)).^2));  
                count=count+1;
                 matchok(ci+i*w,cj+j*w)=1;
             if mse<=min
                min=mse;
             tempi=ci+i*w;
             tempj=cj+j*w; 
            end
        end
     end
  end
end
 ci=tempi;
 cj=tempj;
  mi=ci;
  mj=cj;                         
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -