% <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
% Funkce na ziskani hladiny pro vkladani vodoznaku
%
% function [s]=najdi_prvky_z_hladiny(obraz,hladina,zobraz_prvky)
%
% Vstupni parametry obraz a hladina do ktere vkladame
% dale hodnota true or false zobraz prvky
% Vystupni je dana matice hodnot z dane hladiny
% <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

function [w] = Patchwork_dekoder(obraz,vodoznak,hladina,klic,cislo_klice)

puvod_obraz = imO; 

vodoznak = imread(fname);
vodoz = vodoznak;
A = size(vodoz,2);                                    % x
B = size(vodoz,1);                                    % y  

Y = size(puvod_obraz,2);                                    % x
X = size(puvod_obraz,1);                                    % y  
velikost = X*Y;

cd('c:\Skola\diplomka\matlab_prace');

load W0.mat
load S1.mat
load hladina.mat
load klic.mat                   % cislo klice

%pokud je obraz mensi doplnime chybejici cast nulama
if (A < Y) || (B < X)
  H = zeros(X,Y,'uint8');
    for k=1:A
        for l=1:B      
            H(l,k) = H(l,k) + vodoz(l,k); 
        end
    end
    vodoz = H;
end


% <<<<<<< 8 bitovych rovin, kazda do vlastni matice 1-8 >>>>>     
% Nemusime provadet vypocet puvodniho provedeme jen v prvnim kole

load OH
hlad_po = OH;

load Vodoznak                                                   % vodoznak è. 4
[vy,vx] = size(Vodoznak);                                       % velikost vodoznaku

[hlad_vodoz]=najdi_prvky_z_hladiny(vodoz,hladina,velke);
hlad_vodoz = uint8(hlad_vodoz./255);                            % abym vratili zpet na puvodni hodnoty pred upravou na zobrazeni

% ********** Vytazeni vodoznaku ************

cislo_klice = klic;

if (cislo_klice <=3)                                            % vodoznaky 1-3
    for m=1:Y
        for n=1:X
            Obr_upr(n,m) = bitxor(hlad_vodoz(n,m),S1(n,m));
        end
    end
    
    % >>>>>>>>>>>>>>>>>> NCC vytazeneho vodoznaku s puvodnim vodoznakem >>>>>>>>>>>>>>>>>>>>>>>>> 

        vod = double(Obr_upr);
        vytazeny_vodoznak = double(OH);
        citatel = sum(sum(vod.*vytazeny_vodoznak));
        jmenovatel = sum(sum(vod.^2));
        NCC = citatel/jmenovatel;
   
else
    for a=1:vy;                                                  % vytazeni vodoznaku z obrazu
        for b=1:vx;
            V1(a,b)= hlad_vodoz(a,b);          
            V2(a,b)= hlad_vodoz(PO_sirka-vy+a,b);
            V3(a,b)= hlad_vodoz(a,PO_vyska-vx+b);
            V4(a,b)= hlad_vodoz(PO_sirka-vy+a,PO_vyska-vx+b);
        end
    end

% >>>>>>>>>>>>>>>>>> NCC vytazeneho vodoznaku s puvodnim vodoznakem >>>>>>>>>>>>>>>>>>>>>>>>>
% pokud by se ze stringu dala zavolat promenna usnadnilo by to vypocty
% najde nejlepsi shodu a pote preda jako vysledek zpet

  vod = double(Vodoznak);
  
     for d = 1:4
            switch d
               case 1
                vytazeny_vodoznak = double(V1);
               case 2
                vytazeny_vodoznak = double(V2);
               case 3
                vytazeny_vodoznak = double(V3);
               case 4
                vytazeny_vodoznak = double(V4);
            end
        citatel = sum(sum(vod.*vytazeny_vodoznak));
        jmenovatel = sum(sum(vod.^2));
        NCC(d) = citatel/jmenovatel;      
     end
    
     maximum = max(NCC);                % najdu nejlepsi shodu vodoznaku
     
   for d = 1:4
    if maximum == NCC(d)
            switch d
               case 1
                Obr_upr = V1;
                NC = NCC(d);
               case 2
                Obr_upr = V2;
                NC = NCC(d);
               case 3
                Obr_upr = V3;
                NC = NCC(d);
                case 4
                Obr_upr = V4;
                NC = NCC(d);
            end
     end
   end
 NCC = NC;                      % pokud bude vice stejnych, bylo potreba ulozit do jine promenne aby se neprepsalo NCC
end

% >>>>>>>>>>>>>>  >>>>>>>>>>>>>>>>>>>

% figure;
% colormap('Gray');                 % zobrazeni vodoznaku po utoku
% image(Obr_upr.*255);

if NCC > 0.75
    detectionresult=1;
      else
        detectionresult=0;
end

cd('C:\metoda_1\obraz_po_utocich');
end
