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

%% **********************************************************************************
%*  Kamil Sokol		
%*	Filtrácia s homogénnou maskou 3D
%*  X       - veľkosť masky (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.
stredna = zeros((2*X-1),(2*X-1),(2*X-1));       %vytvorenie prázdnej matice pre strednu hodnotu v okne
C = zeros((2*X-1),(2*X-1),(2*X-1));             %vytvorenie prázdnej matice pre hodnotu C v okne

fprintf('Filtrácia s homogenou maskou 3D: START\n');    %Vypisanie informacie
fprintf('Filtrácia s homogenou maskou 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
                
                for p = 1:1:(2*X-1)     %Pohyb mensieho okna v okne v 3 osách
                    for r = 1:1:(2*X-1)
                        for s = 1:1:(2*X-1)                           
                            okno_M = okno(p:p+2,r:r+2,s:s+2);
                            okno_M = okno_M(:)';
                            okno_M = okno_M(:)';
                            stredna(p,r,s) = mean(okno_M);      %vypocet strednej hodnoty mensieho okna
                            C(p,r,s) = ((var(okno_M))^2)/(mean(okno_M));    %vypocet C hodnoty mensieho okna                            
                        end
                    end
                end       
                
                [minval,ind] = min(C(:));
                [p1,r1,s1] = ind2sub([size(C,1) size(C,2) size(C,3)],ind);   %hladanie najmensej C hodnoty v okne
                obr_fil(i,j,k) = stredna(p1,r1,s1);    %Zapis prisluchajucej strednej hodnoty v okne ako vysledok 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

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

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