function ROImapa = redukce(vstupniobraz, sirkaoknax, polomerOD, polomerROI, fundus)
% Redukce prostoru. Funkce slouzici k vytvoreni binarni mapy, dle ktere se bude prohledavat
% vstupni obraz. Zredukuje se tak mnozstvi prohledavanych pixelu ve
% vstupnim obraze a tak i vypocetni narocnost. 
% Funkce vlastne obsahuje jednoduchy algoritmus pro hrubou lokalizaci OD.
% Kolem nalezeneho stredu se pak vytvori kruhova oblast, ktera je nasledne
% zpracovavana kruhovou transformaci v nasledujicich funkcich detekce OD.
% Lokalizacni algoritmus vyuziva kombinaci gradientu a jasu pro nalezeni
% pozice OD

% VSTUP:
% - vstupniobraz - vstupni obraz, kde dojde k lokalizaci - predpoklada stejny obraz, ktery bude zpracovavan kruhovou
%   transformaci (orezany, zmenseny, ...), avsak nepredzpracovany (vyzaduje se zde pritomnost cevniho reciste)
% - sirkaoknax -  sirka okna pro horizontalni prohledavani obrazu - cca dvojnasobek nejsirsi cevy v obraze
% - polomerOD - predpokladany priblizny polomer optickeho disku - vyuziti pro vertikalni prohledavani obrazu
% - polomerROI - polomer kruhove oblasti ve vystupni binarni mape - mela by byt vetsi nez polomer OD v obraze. Cim vetsi polomer, tim vetsi oblast
%   obrazu bude prohledavana kruhovou transformaci a tim vetsi vypocetni narocnost (soucasne vsak mensi pravdepodobnost vynechani mista OD)
% - fundus - promenna nesouci informaci o typu vstupniho obrazu - urcuje
%   zpusob horizontalni lokalizace
 
% VYSTUP:
% - ROImapa - vystupni binarni mapa o stejnych rozmerech jako vstupni obraz obsahujici kruhovou (jednickovou) oblast, ktera bude prohledavana
%   kruhovou transformaci
    
    [Gx, Gy] = imgradientxy(vstupniobraz, 'sobel');  % gradienty ve smeru x a y
    
% ------- pouzitelne pro starsi matlab ---    
%         mask = fspecial('sobel');
%         Gy = imfilter(vstupniobraz, mask);
% 
%         mask = mask';
%         Gx = imfilter(vstupniobraz, mask);
% 
%         Gy = imadjust(Gy);
%         Gx = imadjust(Gx);
% ------- pouzitelne pro starsi matlab ---        
    
    Ph = (abs(Gx) - abs(Gy));   % gradientni obraz pro horizontalni prohledavani - gradient pouze ve vertikalnim smeru

    Fhor = zeros(1,size(Ph,2)-sirkaoknax);  % inicializace - zrychleni vypoctu
    Ghor = zeros(1,size(Ph,2)-sirkaoknax);  % inicializace - zrychleni vypoctu

    % gradientni obraz pro horizontalni smer je prohledavan zleva doprava oknem o sirce
    % dvojnasobku tloustky nejvetsi cevy. Pro kazdou pozici okna je vypoctena
    % suma gradientniho obrazu a suma jasovych intenzit
    for i = 1:(size(Ph,2)-sirkaoknax)       
        Fhor(i) = sum(sum(Ph(:,i:i+sirkaoknax))); % suma gradientu
        Ghor(i) = sum(sum(vstupniobraz(:,i:i+sirkaoknax))); % suma jasu
    end
     
    if (fundus == 1) || (fundus == 2)
        Hhor = Fhor.*Ghor; % vypocet soucinu sumy gradientu a jasovych hodnot pro kazdou pozici okna - pro zelenou slozku lepsi vysledky nez podil
    else
        Hhor = Fhor./Ghor; % vypocet podilu sumy gradientu a jasovych hodnot pro kazdou pozici okna
    end
    
    [del, pozhor] =  max(Hhor);  % zjisteni pozice maxima - zjisteni horizontalni pozice OD
    pozhor = pozhor + round(sirkaoknax/2); % korekce na nevycentrovane okno v predchozi smycce - skutecna (priblizna) pozice OD v horiz. smeru

    Pv = (abs(Gy) + abs(Gx)); % gradientni obraz pro vertikalni prohledavani - gradient v horizontalnim i vertikalnim smeru

    % vyrez gradientniho obrazu pro prohledani ve vertikalnim smeru centrovany na horizontalni
    % pozici OD
    Pv = imcrop(Pv, [pozhor-polomerOD, 0, polomerOD*2, size(Pv,1)]);
    
    % vyrizly gradientni obraz pro vertikalni smer je prohledavan zhora dolu oknem o
    % rozmerech predpokladane velikosti OD. Pro kazdou pozici je zjistena suma
    % gradientu a suma jasovych intenzit
    for i = 1:(size(Pv,1)-polomerOD*2)
        Fver(i) = sum(sum(Pv(i:i+polomerOD*2,:)));  % suma gradientu
        Gver(i) = sum(sum(vstupniobraz(i:i+polomerOD*2,:))); % suma jasu
    end
    Hver = Fver.*Gver; % vypocet hodnoty vahy gradientu a jasu

    [del, pozver] =  max(Hver);  % zjisteni pozice maxima - zjisteni vertikalni pozice OD
    pozver = pozver + polomerOD; % korekce na nevycentrovane okno v predchozi smycce - skutecna (priblizna) vertikalni pozice OD

%         marker = insertMarker(vstupniobraz, [pozhor pozver], 'size', 18); % zobrazeni nalezeneho stredu OD v obraze;
%         figure
%         imshow(marker)

     [radkumap, sloupcumap] = size(vstupniobraz);
     
     [sloupceROI, radkyROI] = meshgrid(1:sloupcumap, 1:radkumap);
     ROImapa = (radkyROI - pozver).^2 + (sloupceROI - pozhor).^2 <= polomerROI.^2;  % vytvoreni kruhove binarni mapy dle lokalizovaneho OD
     
%      figure
%      imshow(ROImapa)

 
end
