📄 multiresolution.html
字号:
gradBlocX_Y=[gradBlocX(:),gradBlocY(:)]; gradBlocTemp=gradBlocTemp(:);gradBlocX_YINV=pinv(gradBlocX_Y);res3=-gradBlocX_YINV*gradBlocTemp; <span class="comment">% Vecteur déplacement de coordonnées u et v</span>RES3(:,k)=res3; <span class="comment">% Tableau où on regroupe les coordonnées des vecteurs déplacement de chaque bloc</span>k=k+1; <span class="keyword">end</span><span class="keyword">end</span>[V,W]=meshgrid(1:5:Cim-moduloX,1:5:Lim-moduloY);[v1,w1]=size(V);[v2,w2]=size(W);VectX=reshape(RES3(1,:),v1,w1);VectY=reshape(RES3(2,:),v2,w2);<span class="comment">% Affichage des vecteurs déplacement</span>figurequiver(V,W,VectX,VectY)colormap <span class="string">hsv</span><span class="comment">% On observe que le résultat n'est pas parfait mais cela est principalement</span><span class="comment">% du aux imperfections de l'image résultat : certains blocs déplacés</span><span class="comment">% apportent des discontinuités à l'image.</span><span class="comment">% On remarque en revanche que l'approche multi résolution permet d'adapter</span><span class="comment">% l'algorithme de Lucas & Kanade pour des déplacements importants.</span></pre><pre class="codeoutput">Lucas Kanade : le déplacement moyen est de (pixels) :ans = 0.4602 0.5334</pre><img vspace="5" hspace="5" src="MultiResolution_08.png"> <p class="footer"><br> Published with MATLAB® 7.4<br></p> </div> <!--##### SOURCE BEGIN #####% Gaetan Boehringer, Bruno Jacquot & Frédéric Piegay
%% Approche multi-résolution et algorithme de Lucas & Kanade
%% Chargement des images
clear all; close all; clc ;
% Lecture
im1o=double(imread('LKtest2im1.bmp'));
im2o=double(imread('LKtest2im2.bmp'));
[M,N]=size(im1o);
% Affichage
figure;
subplot(1,2,1); imagesc(im1o);axis equal; colormap(gray);title('Image initiale');
subplot(1,2,2); imagesc(im2o);axis equal; colormap(gray); title ('Image décalée');
%% Filtrage
h = fspecial('gaussian',10,3);
im1 = imfilter(im1o,h);
im2 = imfilter(im2o,h);
% Affichage des images filtrées
figure;
subplot(1,2,1); imagesc(im1);axis equal; colormap(gray);title('Image initiale filtrée');
subplot(1,2,2); imagesc(im2);axis equal; colormap(gray);title('Image décalée filtrée');
%% Premier traitement
% Baisse de la résolution
imageBRinter1=BaisseResolution(im1);
imageBR1=BaisseResolution(imageBRinter1);
imageBRinter2=BaisseResolution(im2);
imageBR2=BaisseResolution(imageBRinter2);
[Lim,Cim]=size(imageBR1);
figure;
subplot(1,2,1); imagesc(imageBR1);axis equal; colormap(gray);title('Image initiale basse résolution');
subplot(1,2,2); imagesc(imageBR2);axis equal; colormap(gray); title ('Image décalée basse résolution');
% Calcul de Lucas Kanade
% Gradients
f=[-1,8,0,-8,1]/12;
im1fx=filter2(f,imageBR1,'same'); % Gradient selon x
im1fy=filter2(f',imageBR1,'same'); % Gradient selon y
imt=imageBR2-imageBR1; % Gradient temporel
% Gestion des bords : suppression du bord (épaisseur 10 pixels)
bord=10;
Ix1=im1fx(bord:Lim-bord,bord:Lim-bord);
Iy1=im1fy(bord:Lim-bord,bord:Lim-bord);
It=imt(bord:Lim-bord,bord:Lim-bord);
% Transfert vecteurs colonnes
Ix_y=[Ix1(:),Iy1(:)];
It=It(:);
%Calcul de u et v
Ix_yINV=pinv(Ix_y); % On inverse la matrice
fprintf('Lucas Kanade : le déplacement moyen est de (pixels) :\n')
-Ix_yINV*It % Calcul des coordonnées du vecteur deplacement.
moduloX=mod(Cim,5);% Nombre de blocs de taille (5*5) selon l'axe des abscisses
moduloY=mod(Lim,5);% Nombre de blocs de taille (5*5) selon l'axe des ordonnées
k=1;% Variable d'itération
for i=1:5:Lim-moduloY
for j=1:5:Cim-moduloX
GradBlocX=im1fx(i:i+4,j:j+4); % Bloc de taille (5*5) du gradient selon x
GradBlocY=im1fy(i:i+4,j:j+4); % Bloc de taille (5*5) du gradient selon y
GradBlocTemp=imageBR2(i:i+4,j:j+4)-imageBR1(i:i+4,j:j+4); % Bloc de taille (5*5) du gradient temporel
GradBlocX_Y=[GradBlocX(:),GradBlocY(:)];
GradBlocTemp=GradBlocTemp(:);
GradBlocX_YINV=pinv(GradBlocX_Y);
res=-GradBlocX_YINV*GradBlocTemp; % Vecteur déplacement de coordonnées u et v
RES(:,k)=res; % Tableau où on regroupe les coordonnées des vecteurs déplacement de chaque bloc
k=k+1;
end
end
[X,Y]=meshgrid(1:5:Cim-moduloX,1:5:Lim-moduloY);
[x1,y1]=size(X);
[x2,y2]=size(Y);
vectX=reshape(RES(1,:),x1,y1);
vectY=reshape(RES(2,:),x2,y2);
% Affichage des vecteurs déplacement
figure
quiver(X,Y,vectX,vectY)
colormap hsv
% On retourne à la résolution supérieure
imageMVT1=MVT(imageBR1,RES,imageBRinter1);
figure;
subplot(1,2,1); imagesc(imageBRinter1);axis equal; colormap(gray);title('Image intermédiaire');
subplot(1,2,2); imagesc(imageMVT1);axis equal; colormap(gray); title ('Image résultat intermédiaire');
%% On recalcule Lucas Kanade sur notre image à résolution intermédiaire
% Calcul de Lucas Kanade
% Gradients
imageBRinter1=imageMVT1;
Im1fx=filter2(f,imageBRinter1,'same'); % Gradient selon x
Im1fy=filter2(f',imageBRinter1,'same'); % Gradient selon y
Imt=imageBRinter2-imageBRinter1; % Gradient temporel
[Lim,Cim]=size(imageBRinter1);
% Gestion des bords : suppression du bord (épaisseur 10 pixels)
bord=10;
ix1=Im1fx(bord:Lim-bord,bord:Lim-bord);
iy1=Im1fy(bord:Lim-bord,bord:Lim-bord);
it=Imt(bord:Lim-bord,bord:Lim-bord);
% Transfert vecteurs colonnes
ix_y=[ix1(:),iy1(:)];
it=it(:);
% Calcul de u et v
ix_yINV=pinv(ix_y); % On inverse la matrice
fprintf('Lucas Kanade : le déplacement moyen est de (pixels) :\n')
-ix_yINV*it % Calcul des coordonnées du vecteur deplacement.
ModuloX=mod(Cim,5);% Nombre de blocs de taille (5*5) selon l'axe des abscisses
ModuloY=mod(Lim,5);% Nombre de blocs de taille (5*5) selon l'axe des ordonnées
k=1;% Variable d'itération
for i=1:5:Lim-ModuloY
for j=1:5:Cim-ModuloX
gradBlocX=Im1fx(i:i+4,j:j+4); % Bloc de taille (5*5) du gradient selon x
gradBlocY=Im1fy(i:i+4,j:j+4); % Bloc de taille (5*5) du gradient selon y
gradBlocTemp=imageBRinter2(i:i+4,j:j+4)-imageBRinter1(i:i+4,j:j+4); % Bloc de taille (5*5) du gradient temporel
gradBlocX_Y=[gradBlocX(:),gradBlocY(:)];
gradBlocTemp=gradBlocTemp(:);
gradBlocX_YINV=pinv(gradBlocX_Y);
res2=-gradBlocX_YINV*gradBlocTemp; % Vecteur déplacement de coordonnées u et v
RES2(:,k)=res2; % Tableau où on regroupe les coordonnées des vecteurs déplacement de chaque bloc
k=k+1;
end
end
[V,W]=meshgrid(1:5:Cim-moduloX,1:5:Lim-moduloY);
[v1,w1]=size(V);
[v2,w2]=size(W);
VectX=reshape(RES2(1,:),v1,w1);
VectY=reshape(RES2(2,:),v2,w2);
% Affichage des vecteurs déplacement
figure
quiver(V,W,VectX,VectY)
colormap hsv
% On repasse à la résolution initiale
imageMVT2=MVT(imageMVT1,RES2,im1);
figure;
subplot(1,2,1); imagesc(im1);axis equal; colormap(gray);title('Image initiale filtrée');
subplot(1,2,2); imagesc(imageMVT2);axis equal; colormap(gray); title ('Image résultat après la multi-résolution');
%% Conclusion
% On compare le résultat obtenu avec l'approche mutli résolution et l'image
% déplacée initiale
% Gradients
imagefinale=imageMVT2;
Im1fx=filter2(f,imagefinale,'same'); % gradient selon l'axe des abscisses
Im1fy=filter2(f',imagefinale,'same'); % gradient selon l'axe des ordonnées
Imt=im2-imagefinale; % gradient temporel
[Lim,Cim]=size(imagefinale);
% Gestion des bords : suppression du bord (épaisseur 10 pixels)
bord=10;
ix1=Im1fx(bord:Lim-bord,bord:Lim-bord);
iy1=Im1fy(bord:Lim-bord,bord:Lim-bord);
it=Imt(bord:Lim-bord,bord:Lim-bord);
% Transfert vecteurs colonnes
ix_y=[ix1(:),iy1(:)];
it=it(:);
% Calcul de u et v
ix_yINV=pinv(ix_y); % On inverse la matrice
fprintf('Lucas Kanade : le déplacement moyen est de (pixels) :\n')
-ix_yINV*it % Calcul des coordonnées du vecteur deplacement.
ModuloX=mod(Cim,5);% Nombre de blocs de taille (5*5) selon x
ModuloY=mod(Lim,5);% Nombre de blocs de taille (5*5) selon y
k=1;% Variable d'itération
for i=1:5:Lim-ModuloY
for j=1:5:Cim-ModuloX
gradBlocX=Im1fx(i:i+4,j:j+4); % Bloc de taille (5*5) du gradient selon x
gradBlocY=Im1fy(i:i+4,j:j+4); % Bloc de taille (5*5) du gradient selon y
gradBlocTemp=im2(i:i+4,j:j+4)-imagefinale(i:i+4,j:j+4); % Bloc de taille (5*5) du gradient temporel
gradBlocX_Y=[gradBlocX(:),gradBlocY(:)];
gradBlocTemp=gradBlocTemp(:);
gradBlocX_YINV=pinv(gradBlocX_Y);
res3=-gradBlocX_YINV*gradBlocTemp; % Vecteur déplacement de coordonnées u et v
RES3(:,k)=res3; % Tableau où on regroupe les coordonnées des vecteurs déplacement de chaque bloc
k=k+1;
end
end
[V,W]=meshgrid(1:5:Cim-moduloX,1:5:Lim-moduloY);
[v1,w1]=size(V);
[v2,w2]=size(W);
VectX=reshape(RES3(1,:),v1,w1);
VectY=reshape(RES3(2,:),v2,w2);
% Affichage des vecteurs déplacement
figure
quiver(V,W,VectX,VectY)
colormap hsv
% On observe que le résultat n'est pas parfait mais cela est principalement
% du aux imperfections de l'image résultat : certains blocs déplacés
% apportent des discontinuités à l'image.
% On remarque en revanche que l'approche multi résolution permet d'adapter
% l'algorithme de Lucas & Kanade pour des déplacements importants.
##### SOURCE END #####--> </body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -