返回“程序设计语言”
%melog.m
% ME/MC using four-step log search
clear all;
close all;
load bus_frames frame;
figure(1);
frame1=frame(:,:,1);
imagesc(frame1, [0,255]);
colormap(gray);
figure(2);
frame2=frame(:,:,2);
imagesc(frame2, [0,255]);
colormap(gray);
temp=size(frame);
dimy=temp(1); %height of frame
dimx=temp(2); %width of frame
blockx=16; %block sizes
blocky=16;
srx=15; %size of search window +-
sry=15;
%intialize mvf matrix
matchy=zeros(dimy/blocky,dimx/blockx);
matchx=zeros(dimy/blocky,dimx/blockx);
tic;
for loopi=2:dimy/blocky-1,
%loopi
for loopj=2:dimx/blockx-1,
ybound1=(loopi-1)*blocky+1;
ybound2=loopi*blocky;
xbound1=(loopj-1)*blockx+1;
xbound2=loopj*blockx;
%divide frame2 into blocks
block=frame(ybound1:ybound2,xbound1:xbound2,2); %current block
currentoffy=0; currentoffx=0; least_mse=inf;
for steps=[2 4 8 16], % four step search
for offoffy=-ceil(sry/steps):ceil(sry/steps):ceil(sry/steps), %offset vector
for offoffx=-ceil(srx/steps):ceil(srx/steps):ceil(srx/steps),
offy=currentoffy+offoffy;
offx=currentoffx+offoffx;
if (ybound1+offy>=1&ybound2+offy<=dimy...
&xbound1+offx>=1&xbound2+offx<=dimx)
prev_block=frame(ybound1+offy:ybound2+offy,xbound1+offx:xbound2+offx,1);
current_mse=sum((prev_block(:)-block(:)).^2);
if (current_mse<least_mse) %found currently least mse
least_mse=current_mse;
bestoffy=offy;
bestoffx=offx;
end
end
end
end
currentoffy=bestoffy;
currentoffx=bestoffx;
end
matchy(loopi,loopj)=-bestoffy;
matchx(loopi,loopj)=-bestoffx;
end
end
time_log=toc;
figure(6);
quiver(matchx,matchy);
axis ij;axis image;
title('Motion Vector Field, BM with Four-step Search');
%MC prediction
predict=zeros(dimy,dimx);
for loopi=1:dimy/blocky,
%loopi
for loopj=1:dimx/blockx,
ybound1=(loopi-1)*blocky+1;
ybound2=loopi*blocky;
xbound1=(loopj-1)*blockx+1;
xbound2=loopj*blockx;
offy=-matchy(loopi,loopj);
offx=-matchx(loopi,loopj);
predict(ybound1:ybound2,xbound1:xbound2)...
=frame(ybound1+offy:ybound2+offy,xbound1+offx:xbound2+offx,1);
end
end
figure(3);
%colormap(gray(256));
%subplot(2,1,1);
%imagesc(frame(blocky+1:dimy-blocky,blockx+1:dimx-blockx,2));
%axis image;
%title('Current Frame');
%entropy of motion vector fields
dy=matchy(2:dimy/blocky-1,2:dimx/blockx-1);
dx=matchx(2:dimy/blocky-1,2:dimx/blockx-1);
rangey=min(dy(:)):max(dy(:));
rangex=min(dy(:)):max(dy(:));
[county,tmp]=hist(dy(:),rangey);
[countx,tmp]=hist(dx(:),rangex);
proby=county/sum(county);
probx=countx/sum(countx);
proby(proby==0)=1;
probx(probx==0)=1;
H=-sum(proby.*log(proby)/log(2))-sum(probx.*log(probx)/log(2))
%PSNR between the two frames
DFD=abs(frame(:,:,2)-frame(:,:,1));
DFD_ins=DFD(blocky+1:dimy-blocky,blockx+1:dimx-blockx);
psnr1=sum(sum(DFD_ins.^2));
PSNR_frame=10*log10(255*255*(dimy-2*blocky)*(dimx-2*blockx)/psnr1)
DFD=abs(frame(:,:,2)-predict);
%inside part of the error image
DFD_ins=DFD(blocky+1:dimy-blocky,blockx+1:dimx-blockx);
psnr1=sum(sum(DFD_ins.^2));
PSNR_log=10*log10(255*255*(dimy-2*blocky)*(dimx-2*blockx)/psnr1)
%subplot(2,1,2);
imagesc(predict(blocky+1:dimy-blocky,blockx+1:dimx-blockx));
colormap(gray(256));
axis image;
str=sprintf('Prediction from Prev Frame and ME\nBM Method, Four Step Log Search, PSNR=%5.2fdB',PSNR_log);
title(str);
time_log
%save bus_data time_log PSNR_log -append;
%===================================================================