function [obr_fil] = median2D(maska,P,obr)

%% **********************************************************************************
%*  Kamil Sokol		
%*	Mediánova filtrácia 2D s voliteľnou maskou
%*  maska   - vstupná maska pre filtráciu
%*  P       - počet iterácií
%*  obr     - vstupný obrázok pre filtráciu
%*  obr_fil - výstupný obrázok - filtrovaný
%************************************************************************************

%% Funkcia **************************************************************************
tStart=tic;                 %štart merania času výpočtu 
obr = im2double(obr);
maska(maska==0) = NaN;      %zamena hodnot 0 v maske za Nan     
[m,n] = size (obr);         %zistenie rozmerov org. obrazu
[p,r] = size (maska);       %zistenie rozmerov masky
obr_fil = zeros(m,n);       %vytvorenie prázdnej matice pre výsledny obr.
okno = zeros(p,r);
obr_zvacseny = zeros((m+p-1),(n+r-1));  %vytvorenie prázdnej matice pre zvacseny obr.

fprintf('Medianova filtrácia 2D: START\n');    %Vypisanie informacie
fprintf('Medianova filtrácia 2D hotova z:  00.00 %%');


m_k1 = round((p-1)/2);      %korekcia - o kolko sa ma zvecsit <-m
m_k2 = p - m_k1 - 1;        %korekcia - o kolko sa ma zvecsit m->

n_k1 = round((r-1)/2);      %korekcia - o kolko sa ma zvecsit <-n
n_k2 = r - n_k1 - 1;        %korekcia - o kolko sa ma zvecsit n->

%************************************************************************************
%% Filtrácia ************************************************************************
for pp = 1:1:P          %opakovanie podla poctu iteracii
    
    obr_zvacseny((1+m_k1):(m+m_k1),(1+n_k1):(n+n_k1)) = obr(:,:);

    for i = 1:1:(m_k1)
        obr_zvacseny(i,:) = obr_zvacseny(1+m_k1,:);         %zvecsenie <-m
    end

    for i = 1:1:(m_k2)
        obr_zvacseny(m_k1+m+i,:) = obr_zvacseny(m_k1+m,:);  %zvecsenie m->
    end

    for i = 1:1:(n_k1)
        obr_zvacseny(:,i) = obr_zvacseny(:,1+n_k1);         %zvecsenie <-n
    end

    for i = 1:1:(n_k2)
        obr_zvacseny(:,n_k1+n+i) = obr_zvacseny(:,n_k1+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+p-1),j:(j+r-1));   %naplnenie okna hodnotami
            okno2 = okno.*maska;                    %aplikacia masky
            okno3 = (okno2(:))';                    %hodnoty do jednej rady
            obr_fil(i,j) = nanmedian (okno3);       %zapisanie medianu ako vysleny bod
        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
tElapsed=toc(tStart);                 %koniec merania času výpočtu
fprintf('\nMedianova filtrácia 2D vypočítaná za: %.1f sekúnd \nMedianova filtrácia 2D: HOTOVO \n\n',tElapsed);
%************************************************************************************
