📄 packmatch.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 + -