function [obr_fil] = hom_maska2D(X,P,obr)

%% **********************************************************************************
%*  Kamil Sokol		
%*	Filtrácia s homogénnou maskou 2D
%*  X       - veľkosť masky (2,3,4...) [ (2*X+1) x (2*X+1)]
%*  P       - počet iterácii
%*  obr     - vstupný obrázok pre filtráciu
%*  obr_fil - výstupný obrázok - filtrovaný
%************************************************************************************

%% Funkcia **************************************************************************
tStart=tic;                 %štart merania času výpočtu 
[m,n] = size (obr);         %zistenie rozmerov org. obrazu
obr_fil = zeros(m,n);       %vytvorenie prázdnej matice pre výsledny obr.
obr_zvacseny = zeros((m+2*X),(n+2*X)); %vytvorenie prázdnej matice pre zvacseny obr.
stredna = zeros((2*X-1),(2*X-1));      %vytvorenie prázdnej matice pre strednu hodnotu v okne
C = zeros((2*X-1),(2*X-1));            %vytvorenie prázdnej matice pre hodnotu C v okne

fprintf('Filtrácia s homogenou maskou 2D: START\n');    %Vypisanie informacie
fprintf('Filtrácia s homogenou maskou 2D hotova z:  00.00 %%');
%************************************************************************************
%% Filtrácia ************************************************************************
for pp = 1:1:P              %opakovanie podla poctu iteracii
    
    obr_zvacseny((1+X):(m+X),(1+X):(n+X)) = obr(:,:);
    for i = 1:1:(X)
        obr_zvacseny(i,:) = obr_zvacseny(1+X,:);         %zvecsenie <-m
        obr_zvacseny(X+m+i,:) = obr_zvacseny(X+m,:);     %zvecsenie m->
        obr_zvacseny(:,i) = obr_zvacseny(:,1+X);         %zvecsenie <-n
        obr_zvacseny(:,X+n+i) = obr_zvacseny(:,X+n);     %zvecsenie n->
    end
    
    for i = 1:1:(m)          %Pohyb okna v 2 osách
        for j = 1:1:(n)
                okno = obr_zvacseny(i:i+2*X,j:j+2*X); %naplnenie okna hodnotami
                for p = 1:1:(2*X-1)     %Pohyb mensieho okna v okne v 2 osách
                    for r = 1:1:(2*X-1)                          
                            okno_M = okno(p:p+2,r:r+2);
                            okno_M = okno_M(:)';
                            okno_M = okno_M(:)';
                            stredna(p,r) = mean(okno_M);        %vypocet strednej hodnoty mensieho okna
                            C(p,r) = ((var(okno_M))^2)/(mean(okno_M));  %vypocet C hodnoty mensieho okna
                    end
                end       
                
                [minval,ind] = min(C(:));
                [p1,r1] = ind2sub([size(C,1) size(C,2)],ind);   %hladanie najmensej C hodnoty v okne
                obr_fil(i,j) = stredna(p1,r1);      %Zapis prisluchajucej strednej hodnoty v okne ako vysledok bodu
                
        end
        progres = ((pp*i)/(P*m))*100;   %výpočet progresu
        fprintf('\b\b\b\b\b\b\b%05.2f %%',progres);
    end
    obr(:,:) = obr_fil(:,:);
end

obr_fil = obr_fil./255;               %uprava rozmedzia jasu
tElapsed=toc(tStart);                 %koniec merania času výpočtu
fprintf('\nFiltrácia s homogenou maskou 2D vypočítaná za: %.1f sekúnd \nFiltrácia s homogenou maskou 2D: HOTOVO \n\n',tElapsed);

%************************************************************************************
