function [ vystup_fce ] = rozklad(vst_obraz, filters, urovne )
%ROZKLAD Funkce provede rozklad obrazu pomoci frameletove transformace
%   Funkce je napsana pro pouziti 4 filtru!
%
%   Vstupy funkce jsou:
%       vst-obraz - obraz, ktery ma byt rozlozen
%       filters - banka filtru o rozmerech cell(4,1)
%       urovne - pocet urovni dekompozice
%
%   Vystupem funkce budou bunky poli matic koeficientu nasledujiciho tvaru:
%       koeficienty = cell(urovne,1) - obsahuje vnorene pole matic koef.
%                                      pro kazdou uroven rozkladu
%       koeficienty{1,1} = cell(4,4) - matice koeficientu ur. rozkladu
%

    obraz_r = double(vst_obraz)/255;
    pole_koef = cell(urovne,1);
    pocet_filtru = length(filters);

for p_ur = 1:urovne

    [height,width] = size(obraz_r);
    m = length(filters{1,1});
    act_row = zeros(1,width);
    
    % prepocitani velikosti pro vysledek konvoluce a podvzorkovani
    w_zbytek = rem(width+m-1,2);    % prevedeni na integer
    xwidth = (((width+m-1)/2)-w_zbytek/2);
    
    h_rows = cell(pocet_filtru,1);
    
    for i = 1:pocet_filtru
        z = zeros(height,xwidth);
        h_rows{i,1} = z;
    end
        

    % nasleduje aplikace filtru na obsah jednotlivych radku a provede se
    % podvzorkovani, cili se obraz smrskne v horizontalní rovine
    for row = 1:height
        act_row = obraz_r(row,:);
        
        for a_f = 1:pocet_filtru    % conv. a downsample pro kazdy filtr
           filtr_x = filters{a_f,1}(1,:);
           x_f = downsample(conv(act_row,filtr_x),2,1);
           h_rows{a_f,1}(row,:) = x_f;
        end
        
    end
    
    
    
    % jelikoz se musi pouzit 4 filtry na kazdy z predchozich vysledku, 
    % byla definovana funkce DOWN.
    f_x = cell(pocet_filtru,1);
    
    for i = 1:pocet_filtru
        f_x{i,1} = down(height, width, h_rows{i,1}, filters);  
    end

    
    % je potreba usporadat koeficienty do jednotlivych bunek
    XX = cell(pocet_filtru,pocet_filtru);
    
    for radek_koef = 1:pocet_filtru
        
        for sloupec_koef = 1:pocet_filtru
            XX{radek_koef,sloupec_koef} = f_x{radek_koef,1}{sloupec_koef,1};
        end
         
    end
    
    % koeficienty {1,1} se urci jako vychozi obraz dalsi urovne
    obraz_r = XX{1,1};
    pole_koef{p_ur,1} = XX; % mezivysledek, vsechny koeficietny urovni
end   

    vystup_fce = pole_koef;



end




function y = down(height, width, x_rows, filters)
%DOWN Funkce slouzi k zjednoduseni funkce ROZKLAD.
%   Funkce provadi aplikaci filtru a podvzorkovani ve vertikalni rovine.
%   Vstupy jsou:
%       height - pocet radku matice koeficientu
%       width - pocet sloupcu matice koef.
%       x_rows - vysledek aplikace filtru a podvzorkovani v horiz. rovine
%       filters - filtry
%
%   Vystup:
%       pole matic koeficientu o rozmeru xx = cell(4,1);


    pocet_filtru = length(filters);
    xx = cell(pocet_filtru,1);
    
    m = length(filters{1,1});
    
    pocet_filtru = length(filters);
    
    %   prepocitani velikosti pro vysledek konvoluce a podvzorkovani
    w_zbytek = rem(width+m-1,2); 
    xwidth = (((width+m-1)/2)-w_zbytek/2);
    
    h_zbytek = rem(height+m-1,2);       
    xheight = (((height+m-1)/2)-h_zbytek/2);
    
    for i = 1:pocet_filtru
        xx{i,1} = zeros(xheight,xwidth);
    end
    
    
    
    % conv a downsample vstupu se vsema filtrama 
    act_col = zeros(height,1);
    
    for col = 1:xwidth
        act_col = x_rows(:,col);
        
        for a_f = 1:pocet_filtru
            x = downsample(conv(act_col',filters{a_f,1}),2,1);
            xx{a_f,1}(:,col) = x';
        end
        

    end
    
    y = xx; 
    
end