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

%% **********************************************************************************
%*  Kamil Sokol		
%*	Filtrácia maximálna homogenita okolia pixelu 2D
%*  X       - veľkosť masky (1,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.

fprintf('Filtrácia max. homogenita okolia 2D: START\n');    %Vypisanie informacie
fprintf('Filtrácia max. homogenita okolia 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
                okno = okno(:)';                        %hodnoty do jednej rady
                C_dolne = (1-2*(var(okno)))*mean(okno); %Vypocet dolnej hranice C
                C_horne = (1+2*(var(okno)))*mean(okno); %Vypocet hornej hranice C
                pocitadlo = 0;
                sucet = 0;
                for CC = 1:1:((1+2*X)^2)                %Nasleduje vypocet len bodmy ktore maju spravu hodnotu (urcenu hranicami)
                    if okno(CC)>=C_dolne
                        if okno(CC)<=C_horne
                            sucet = sucet + okno(CC);
                            pocitadlo = pocitadlo+1;
                        end
                    end
                end
                obr_fil(i,j) = sucet/pocitadlo;        %Vypocet a zapis vysledneho 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
            %uprava rozmedzia jasu
min_value = min(min(obr_fil));
obr_fil = obr_fil-min_value;
max_value = max(max(obr_fil));
obr_fil = obr_fil./max_value;
tElapsed=toc(tStart);                 %koniec merania času výpočtu
fprintf('\nFiltrácia max. homogenita okolia 2D vypočítaná za: %.1f sekúnd \nFiltrácia max. homogenita okolia 2D: HOTOVO \n\n',tElapsed);

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