function [gabor_array, matice_indexu] = gabor_bank(directions, scales, kernel_window)
% Funkce vytvori banku jader (kernel) pro Gaboruv filtr

%% Vytvoření prázdné výstupní proměnné
gabor_array = cell(scales, directions);

%% Nastavení parametrů rovnice
k = sqrt(2*log(2));
omega_max = pi/2;
factor = nthroot(2, 4);

% Zjištění jednotlivých úhlů a jejich správné otočení
uhly = [0:11.25:180] + 90;
uhly = uhly(:,1:16);

% Nalezení středu okna
kernel_middle = (kernel_window + 1) / 2;

%% Výpočet jednotlivých  
for row=1:scales
    omega=omega_max/(factor^(row-1));
    sigma_x=3*k/omega;
    sigma_y=6*k/omega;
    for col=1:directions
        frac=1/(2*pi*sigma_x*sigma_y);
        window=zeros(kernel_window);
        for x=1:kernel_window
            xx = x - kernel_middle;
            for y=1:kernel_window
                yy = y - kernel_middle;
                x_prime=xx*cosd(uhly(col))+yy*sind(uhly(col));
                y_prime=-xx*sind(uhly(col))+yy*cosd(uhly(col));
                x_frac=(x_prime/sigma_x)^2;
                y_frac=(y_prime/sigma_y)^2;
                window(x,y)=frac*exp((-0.5*(x_frac+y_frac))+1i*omega*x_prime);
            end
        end
        gabor_array{row,col}=window;
    end
end

% Vytvoření indexů a matice indexů pro práci s bankou
pozice = 1:(directions*scales);
matice_indexu = reshape(pozice, directions, scales)';

%% Vykreslení reálné části banky filtrů
%     for i = 1:scales
%         for j = 1:directions        
%         subplot(scales,directions,(i-1)*directions+j);        
%         imshow(real(gabor_array{i,j}),[]);
%         end
%       % Uložení banky jako obrázek
%         print('krivka','-dpng','-r600')
%     end
end