%   KORESPONDENCE      
%   koresp_sourad = korespondence(obr1,obr2,sourad1,sourad2,vaha,prah,method)
%
%   Funkce Korespondence vyhledává korespondující značky v nalezených
%   souřadnicích bifurkací. K vyhledávání slouží lokální parametry obrazu
%   (entropie, rozptyl, průměr,atd.)
%
%   obr1    -   referencni obrazek
%   obr2    -   registrovany obrazek
%   sourad1 -   souradnice bifurkaci v referencnim obrazku
%   sourad2 -   souradnice bifurkaci v registrovanem obrazku
%   vaha    -   vaha s jakou se uplatni vzdalenosti mezi bifurkacemi
%               (default - 4)
%   prah    -   Prahova hodnota pro uznani spravnych korespondenci
%   method  -   normal - normalizace obrazu, orig - bez normalizace

function koresp_sourad = korespondence(obr1,obr2,sourad1,sourad2,vaha,prah,method)


    
    sirka = 20;     % sirka vyrezu pro statistiky
    koresp_sourad = [];
    pocet_s = 1;
    
    %% volba jestli proběhne předzpracování obrazu
    switch method
       case {'orig'}
            obr_g1 = double(obr1(:,:,2));
            obr_g2 = double(obr2(:,:,2));
            obr_g1=obr_g1*1/max(max(obr_g1)); 
            obr_g2=obr_g2*1/max(max(obr_g2));
       case 'normal'
            obr_g1 = normal2(obr1);
            obr_g2 = normal2(obr2);
       otherwise
            obr_g1 = double(obr1(:,:,2));
            obr_g2 = double(obr2(:,:,2));
            obr_g1=obr_g1*1/max(max(obr_g1)); 
            obr_g2=obr_g2*1/max(max(obr_g2));
    end
    %% smazání nulových souřadnic
    sourad1(:,find (sourad1(1,:)==0))=[];
    sourad2(:,find (sourad2(1,:)==0))=[];
    %%  Vyhledávání korespondencí
    for k = 1:length(sourad1)
        s1 = sourad1(:,k);

        
        if (s1(1)-sirka)<1 || (s1(1)+sirka) > 1000 || (s1(2)+sirka) > 1500 || (s1(2)-sirka) < 1
            obr_p1 = obr_g1(1:41,1:41);
        else
            obr_p1 = obr_g1(s1(1)-sirka:s1(1)+sirka,s1(2)-sirka:s1(2)+sirka);
        end
        %% Lokální parametry z kruznice
        [prumer_k1, odch_k1] = kruznice(obr_g1,s1);


        %% entropie
        h1 = imhist(obr_p1);
        h1(find (h1==0))=[];

        H1 = - sum(h1./numel(obr_p1) .* log(h1./numel(obr_p1)));

        %% směr. odchylka

        odch1 = std(std(obr_p1));
        %% vytvoření proměnných

        odch2 = zeros(1,length(sourad2));
        H2 = zeros(1,length(sourad2));
        prumer_k2 = zeros(1,length(sourad2));
        odch_k2 = zeros(1,length(sourad2));
        e2 = zeros(1,length(sourad2));
        %% Vypočet parametrů v registrovaném obraze
        for i = 1:length(sourad2)

            s2 = sourad2(:,i);

            if (s2(1)-sirka)<1 || (s2(1)+sirka) > 1000 || (s2(2)+sirka) > 1500 || (s2(2)-sirka) < 1
                obr_p2 = obr_g2(1:41,1:41);
            else
                obr_p2 = obr_g2(s2(1)-sirka:s2(1)+sirka,s2(2)-sirka:s2(2)+sirka);
            end
            
            odch2(i) = std(std(obr_p2));

            h2 = imhist(obr_p2);
            h2(find (h2==0))=[];
            H2(i) = - sum(h2./numel(obr_p2) .* log(h2./numel(obr_p2)));

            [prumer_k2(i), odch_k2(i)] = kruznice(obr_g2,s2);   % kruznice

            e2(i) = sqrt((s1(1) - s2(1))^2 + (s1(2) - s2(2))^2); %eukl. vzdalenost
    %         e22(i) = (((s1(1) - s2(1)))^2 + ((s1(2) - s2(2)))^2) * vaha;
    %         %eukl. vzdalenost delena
        end
        %%
        e22 = (e2/max(e2))*vaha;    % váhování euklidovských vzdáleností

        vektor1 = zeros(4,length(odch1));
        vektor2 = zeros(4,length(odch2));

        vektor1(1,:) = odch1;
        vektor1(2,:) = H1;
        vektor1(3,:) = prumer_k1;
        vektor1(4,:) = odch_k1;

        vektor2(1,:) = odch2;
        vektor2(2,:) = H2;
        vektor2(3,:) = prumer_k2;
        vektor2(4,:) = odch_k2;

        pom = sort(odch2);
        max_odch = max(odch1,pom(end));
        pom = sort(H2);
        max_H = max(H1,pom(end));
        pom = sort(prumer_k2);
        max_prumer_k = max(prumer_k1,pom(end));
        pom = sort(odch_k2);
        max_odch_k = max(odch_k1,pom(end));
        clear D2 D
        
        %% Výpočet euklidovské vzdálenosti mezi normovanými lok. param.
        for i = 1 : length(sourad2)
            D2(1,i) = ((vektor1(1,1) - vektor2(1,i)) / max_odch )^2;
            D2(2,i) = ((vektor1(2,1) - vektor2(2,i)) / max_H )^2;
            D2(3,i) = ((vektor1(3,1) - vektor2(3,i)) / max_prumer_k )^2;
            D2(4,i) = ((vektor1(4,1) - vektor2(4,i)) / max_odch_k )^2;
            D2(5,i) = e22(i);
        end

        D = sqrt(D2(1,:) + D2(2,:) + D2(3,:) + D2(4,:) + D2(5,:));
        %% nalezení nejbližší souřadnice
        s_min_d = find(D == min(D));
        s2 = sourad2(:,s_min_d(1));
        %% zjištění, zda-li nalezená bifurkace vyhovuje podmínce a její uložení
        if min(D) < prah
            sourad2(:,s_min_d(1)) = [];

            koresp_sourad(1:2,pocet_s) = s1;
            koresp_sourad(3:4,pocet_s) = s2;
            koresp_sourad(5,pocet_s) = min(D);
            pocet_s = pocet_s + 1;
            
            %% prohlizeni vysledku (opoznamkovat)
%             vel_vyr = 50;   %velikost vyrezu
%             obr_g11 = obr_g1;
%             obr_g11(s1(1) - 5 : s1(1) + 5,s1(2)) = 1;
%             obr_g11(s1(1),s1(2) - 5 : s1(2) + 5) = 1;
%             obr_g11 = obr_g11(s1(1) - vel_vyr : s1(1) + 100,s1(2) - vel_vyr : s1(2) + vel_vyr);
%             obr_g22 = obr_g2;
%             obr_g22(s2(1) - 5 : s2(1) + 5,s2(2)) = 1;
%             obr_g22(s2(1),s2(2) - 5 : s2(2) + 5) = 1;   
%             obr_g22 = obr_g22(s2(1) - vel_vyr : s2(1) + vel_vyr,s2(2) - 100 : s2(2) + vel_vyr);
% 
%             figure(3)
%             subplot(2,2,1)
%             imshow(obr_g11)
%             subplot(2,2,2)
%             imshow(obr_g22)
%             misto = zeros(1,length(D2(1,:)));
%             misto2 = zeros(1,length(D2(1,:)));
%             misto(s_min_d(1)) = max(max(D2));
%             misto2(s_min_d(1)) = max(max(D));
% 
%             subplot(2,2,3)
%             plot(D,'black')
%             text(s_min_d(1),min(D),[' \leftarrow ' '' num2str(min(D))])
%             hold on
%             plot(misto2,'red')
%             hold off
%             title('Celkova vzdalenost')
%             subplot(2,2,4)
%             plot(D2(1,:),'blue')
%             hold on
%             plot(D2(2,:),'green')
%             plot(D2(3,:),'black')
%             plot(D2(4,:),'yellow')
%             plot(D2(5,:),'cyan')
%             plot(misto,'red')
%             hold off
%             legend('Směr. odch','Entropie','Průměr z kružnice','Směr. odch. z kružnice', ...
%                 'Vzdalenost', 'Vybrane misto')

%             pause()
            %%
        end

    end

end








