% Tato funkce slouzi k urceni posunu mezi dvema vyrezy pomoci fazove korelace
%
% Vstupni promenne:
%   vyrez1 - referencni, vyrez2 - registrovany

function [posun_x, posun_y] = lokalni_fazova_korelace (vyrez1, vyrez2)

[a,b,e]=size(vyrez1);
f=size(vyrez2,3);

% vybrani vhodne slozky
if e==3
    f1=(vyrez1(:,:,2));
else
    f1=(vyrez1(:,:,1));
end

if f==3
    f2=(vyrez2(:,:,2));
else
    f2=(vyrez2(:,:,1));
end

%urceni masek pro naslednou eliminaci
maska1=zeros(size(f1));
maska1(f1>=5)=1;
maska2=zeros(size(f2));
maska2(f2>=5)=1;


H1=[1 1 1; 1 1 1;1 1 1]/9;
f1=conv2(double(f1),H1,'same');
f2=conv2(double(f2),H1,'same');

H1=[-1 -1 -1 ;-1 9 -1 ;-1 -1 -1];
f1=conv2(double(f1),H1,'same');
f2=conv2(double(f2),H1,'same');

%eliminace vlivu masky
maska1=bwmorph(maska1,'dilate',5);
maska1=bwmorph(maska1,'erode',7);
f1=f1.*double(maska1);
f1(f1==0)=mean(mean(f1(f1~=0)));
        
maska2=bwmorph(maska2,'dilate',5);
maska2=bwmorph(maska2,'erode',7);
f2=f2.*double(maska2);
f2(f2==0)=mean(mean(f2(f2~=0)));

%eliminace okrajoveho efektu
f1=okno(f1);
f2=okno(f2);     

F1=fft2(f1);                                    
F2=fft2(f2);                                      

%vypocet fazove korelace
vypocet=F1.*conj(F2)./abs(F1.*F2);
vypocet=ifft2(vypocet);
    
%filtrovani vysledku fazove korelace
 H1=[1 1 1; 1 2 1; 1 1 1]/10;
vypocet=conv2(vypocet,H1,'same'); 

%zjisteni souradnice maxima                
[m,n]=find(vypocet==max(max(vypocet)));     
        
%urceni spravneho posunu
if (m<a/2) 
    posun_y=m-1;            
else
    posun_y=-(a-m+1);  
end
    
if (n<b/2)
    posun_x=n-1;
else
    posun_x=-(b-n+1);      
end

end
