Cette méthode consiste à trouver les mouvements de l'image pour chaque bloc d'une image. Pour une taille de
bloc de taille M*N, on divise l'image par bloc de la manière suivante :
Pour observer le mouvement subit entre deux images, on va utiliser les blocs de la première image comme bloc de référence.
Pour chaque bloc de référence, on va étudier le déplacement de ce dernier avec le bloc correspondant dans la seconde image et aussi des 8 blocs voisins. Pour le schéma précédent, si le bloc étudié est le N°5 de l'image à t alors
nous rechercherons les mouvements pour les blocs N°1 à 9 de l'image à t+1. Nous pouvons modéliser les blocs de l'algorithme par le modèle suivant
Le but de l'algorithme est d'utiliser le bloc M*N de l'image à t+1 comme un masque dans la fenêtre de l'image à t. Nous pouvons
réaliser 4 calculs différents:
Où X est le bloc de l'image à t+1 et Y la fenêtre de l'image à t, i et j dénifissent les pixels de la fenêtre. Attention aux effets de bord !!!.
Maintenant, pour chaque résultat de recherche de mouvement de chaque bloc nous avons deux cas possibles :
clear all;
close all;
[filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif;*.bmp','All Image Files';...
'*.*','All Files' },'mytitle',...
'C:\Work\myfile.jpg');
x = imread(filename);
x=double(x);
M1=x;
M2=x;
M2(100:150,100:150)=x(103:153,103:153);
[l c]=size(M1);
n=32;
M = floor(l/n);
N = floor(c/n);
for i = 1 : n-2
for j = 1 : n-2
blockref=M1( i*M+1 : (i+1)*M , j*N+1 : (j+1)*N);
blockcurrent=M2( (i-1)*M+1 : ((i+1)+1)*M , (j-1)*N+1 : ((j+1)+1)*N);
[tx ty]=size(blockcurrent);
for x = 1 : tx - M
for y = 1 : ty - N
MSE(x,y)= sum(sum((blockref - blockcurrent(x:x+(M-1),y:y+(N-1))).^2))/(M*N);
MAD(x,y)=sum(sum(abs(blockref - blockcurrent(x:x+(M-1),y:y+(N-1)))))/(M*N);
SAD(x,y)=sum(sum(abs(blockref - blockcurrent(x:x+(M-1),y:y+(N-1)))));
cross1 = sum(sum( blockref.*blockcurrent(x:x+(M-1),y:y+(N-1)) ));
cross2 = sum(sum( blockref.^2 ))^0.5;
cross3 = sum(sum( blockcurrent(x:x+(M-1),y:y+(N-1)).^2 ))^0.5;
CCF(x,y)= cross1/(cross2*cross3);
end
end
%MSE MAD et SADvminimisation
if MSE(M,N)==0
vmse(i,j,1)= 0;
vmse(i,j,2)= 0;
else
[valx minx] = min(SAD);
[valy miny] = min(valx);
minx=minx(miny);
vmse(i,j,1)=minx-(M+1);
vmse(i,j,2)=miny-(N+1);
end
if MAD(M,N)==0
vmad(i,j,1)= 0;
vmad(i,j,2)= 0;
else
[valx minx] = min(SAD);
[valy miny] = min(valx);
minx=minx(miny);
vmad(i,j,1)=minx-(M+1);
vmad(i,j,2)=miny-(N+1);
end
if SAD(M,N)==0
vsad(i,j,1)= 0;
vsad(i,j,2)= 0;
else
[valx minx] = min(SAD);
[valy miny] = min(valx);
minx=minx(miny);
vsad(i,j,1)=minx-(M+1);
vsad(i,j,2)=miny-(N+1);
end
%CCF maximisation
if CCF(M,N)== max(max(CCF))
vccf(i,j,1)= 0;
vccf(i,j,2)= 0;
else
[valx maxx] = max(CCF);
[valy maxy] = max(valx);
maxx=maxx(maxy);
vccf(i,j,1)=maxx-M;
vccf(i,j,2)=maxy-N;
end
end
end
figure( 'Name','Optical Flow: Block Based',...
'NumberTitle','off',...
'color',[0.3137 0.3137 0.5098]);
subplot(221)
imshow(uint8(M2))
hold on
quiver([M*2 : M : (n-1)*M]'*ones(1,n-2),ones(1,n-2)'*[N*2 : N : (n-1)*N],vmse(:,:,1),vmse(:,:,2),'r')
title('Mean Square Error')
subplot(222)
imshow(uint8(M2))
hold on
quiver([M*2 : M : (n-1)*M]'*ones(1,n-2),ones(1,n-2)'*[N*2 : N : (n-1)*N],vmad(:,:,1),vmad(:,:,2),'r')
title('Mean Absolute Difference')
subplot(223)
imshow(uint8(M2))
hold on
quiver([M*2 : M : (n-1)*M]'*ones(1,n-2),ones(1,n-2)'*[N*2 : N : (n-1)*N],vsad(:,:,1),vsad(:,:,2),'r')
title('Sum Absolute Difference')
subplot(224)
imshow(uint8(M2))
hold on
quiver([M*2 : M : (n-1)*M]'*ones(1,n-2),ones(1,n-2)'*[N*2 : N : (n-1)*N],vccf(:,:,1),vccf(:,:,2),'r')
title('Cross Correlation function')
Cette algorithme de flot optique ne détecte que les mouvements de type translation. Si le mouvement est de type rotation, ou Zoom il sera mal détecté.
Copyright © 2010-2014, tous droits réservés, contact : operationpixel@free.fr