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

%% **********************************************************************************
%*  Kamil Sokol		
%*	Filtrácia maximálna homogenita okolia pixela 3D
%*  X       - veľkosť masiek (2,3,4...) [ (2*X+1) x (2*X+1) x (2*X+1)]
%*  P       - počet iterácii
%*  obr     - vstupné 3D obrazové dáta pre filtráciu
%*  obr_fil - výstupné 3D obrazové dáta - filtrované
%************************************************************************************

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

fprintf('Filtrácia max. homogenita okolia 3D: START\n');    %Vypisanie informacie
fprintf('Filtrácia max. homogenita okolia 3D 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),(1+X):(o+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->
        obr_zvacseny(:,:,i) = obr_zvacseny(:,:,1+X);         %zvecsenie <-o
        obr_zvacseny(:,:,X+o+i) = obr_zvacseny(:,:,X+o);     %zvecsenie o->
    end
    
    for i = 1:1:(m)             %Pohyb okna v 3 osách
        for j = 1:1:(n)
            for k = 1:1:(o)
                okno = obr_zvacseny(i:i+2*X,j:j+2*X,k:k+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
                pocitadlo = 0;
                sucet = 0;
                for CC = 1:1:((1+2*X)^3)                        %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,k) = sucet/pocitadlo;               %Vypocet a zapis vysledneho bodu
            end
        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(min(obr_fil)));
obr_fil = obr_fil-min_value;
max_value = max(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 3D vypočítaná za: %.1f sekúnd \nFiltrácia max. homogenita okolia 3D: HOTOVO \n\n',tElapsed);

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