function [vysledek, vyslednevrcholy, senzitivita, specificita, presnost, prekryti] = main(zdroj, fundus, vyhodnotit, vrcholy)
% MAIN.M - HLAVNI FUNKCE
% Funkce obsahuje nastaveni pro kruhovou transformaci a vola vsechny dilci
% funkce
% veskere vypocty probihaji uvnitr teto funkce a funkci volanych touto
% funkci

%% ----------------- NASTAVENI VSTUPNICH PARAMETRU ------------------------

 if fundus == 1     % NASTAVENI PRO HRF DATABAZI
     
     pocetprimek = 120;     % 120 - pocet pouzitych radialnich primek - mozno pouzit 20, 30, 40, 60, 90, 120, 180, 360
     vzdalodst = 50;        % 50 - delka radialnich primek - maximalni vzdalenost od centralniho pixelu, ve ktere bude prohledavano
     minvzdalodst = 30;     % 30 - minimalni vzdalenost od centralniho pixelu, ve ktere bude prohledavano

     zmenseniobr = 0.2;     % 0,2 - koeficient zmenseni vstupniho obrazu. Spolecne se zmenou zmenseni se musi upravit patricne delky radialnich primek - vzdalodst a minvzdalodst!

     FILTRACEPRED = 0;      % zapinani a vypinani filtrace pred tvorbou OD mapy
     FILTRACEPO = 1;        % zapinani a vypinani filtrace po tvorbe OD mapy
     
     zvyhodnit = 1;         % zapinani a vypinani zvyhodneni vyraznych hranic pri vypoctu OD mapy

     oreznahore = 80;       % 80 - horni a dolni orez vstupniho obrazu       
     orezzleva = 70;        % 70 - levy a pravy orez vstupniho obrazu

     sirkaoknax = 10;       % 10 - sirka okna pro lokalizaci - cca dvojnasobek nejsirsi cevy
     polomerOD = 40;        % 40 - predpokladany polomer OD - pro lokalizaci

     polomerROI = 50;       % 80 - polomer oblasti, ktera bude prohledavana kruhovou transf. (polomer BINARNI MAPY)
 
     
     
     
 elseif fundus == 2     % NASTAVENI PRO DRIONS DATABAZI
     
     pocetprimek = 120;     % 120 - pocet pouzitych radialnich primek - mozno pouzit 20, 30, 40, 60, 90, 120, 180, 360
     vzdalodst = 60;        % 60 - delka radialnich primek - maximalni vzdalenost od centralniho pixelu, ve ktere bude prohledavano
     minvzdalodst = 39;     % 39 - minimalni vzdalenost od centralniho pixelu, ve ktere bude prohledavano


     zmenseniobr = 1;       % 1 - koeficient zmenseni vstupniho obrazu. Spolecne se zmenou zmenseni se musi upravit patricne delky radialnich primek - vzdalodst a minvzdalodst!

     FILTRACEPRED = 0;      % zapinani a vypinani filtrace pred tvorbou OD mapy
     FILTRACEPO = 1;        % zapinani a vypinani filtrace po tvorbe OD mapy
     
     zvyhodnit = 0;         % zapinani a vypinani zvyhodneni vyraznych hranic pri vypoctu OD mapy

     oreznahore = 80;       % 80 - horni a dolni orez vstupniho obrazu         
     orezzleva = 100;   	% 100 - levy a pravy orez vstupniho obrazu

     
     sirkaoknax = 15;       % 15 - sirka okna pro lokalizaci - cca dvojnasobek nejsirsi cevy
     polomerOD = 50;       	% 50 - predpokladany polomer OD - pro lokalizaci

     polomerROI = 60;       % 60 - polomer oblasti, ktera bude prohledavana kruhovou transf. (polomer BINARNI MAPY)

     
     
     
 else           % NASTAVENI PRO SNIMKY Z VIDEO OFTALMOSKOPU

     pocetprimek = 120;     % 120 - pocet pouzitych radialnich primek - mozno pouzit 20, 30, 40, 60, 90, 120, 180, 360
     vzdalodst = 68;        % 68 - delka radialnich primek - maximalni vzdalenost od centralniho pixelu, ve ktere bude prohledavano
     minvzdalodst = 44;     % 44 - minimalni vzdalenost od centralniho pixelu, ve ktere bude prohledavano


     zmenseniobr = 0.5;     % 0.5 - koeficient zmenseni vstupniho obrazu. Spolecne se zmenou zmenseni se musi upravit patricne delky radialnich primek - vzdalodst a minvzdalodst!

     FILTRACEPRED = 0;      % zapinani a vypinani filtrace pred tvorbou OD mapy
     FILTRACEPO = 1;        % zapinani a vypinani filtrace po tvorbe OD mapy
     zvyhodnit = 0;         % zapinani a vypinani zvyhodneni vyraznych hranic pri vypoctu OD mapy

     oreznahore = 20;       % 20 - horni a dolni orez vstupniho obrazu         
     orezzleva = 20;        % 20 - levy a pravy orez vstupniho obrazu

     sirkaoknax = 20;       % 20 sirka okna pro lokalizaci - cca dvojnasobek nejsirsi cevy
     polomerOD = 48;        % 48 predpokladany polomer OD - pro lokalizaci

     polomerROI = 35;       % 35 - polomer oblasti, ktera bude prohledavana kruhovou transf. (polomer BINARNI MAPY)

 end
 
 
 
 
 
 
%% ----------------- OSETRENI KLICOVYCH PARAMETRU -----------------------------------
 if rem(360,pocetprimek) > 0        % pocet primek musi byt takovy, aby delil cislo 360 bezezbytku
     pocetprimek = 120;             % defaultni nastaveni
     disp('pocet primek byl automaticky zmenen na 120!')
 end

 if vzdalodst <= minvzdalodst 
    disp('maximalni vzdalenost prohledavani od stredu musi byt vetsi nez minimalni vzdalenost od stredu!')
    return 
 end

 
 

 
  obraz = im2double(imread(zdroj));             % nacteni vstupniho obrazu
 
%% ----------------- UPRAVY VSTUPNINHO OBRAZU------------------------------
  obr = imresize(obraz,zmenseniobr);            % zmenseni vstupniho obrazu pro experim
 
  jasovka = obr;
  if size(obr,3) == 3           % pokud je obraz barevny (RGB)
      cervena = obr(:,:,1);     % barevne slozky
      zelena = obr(:,:,2);      % barevne slozky
      
      jasovka = (0.75 * cervena) + ((1 - 0.75) * zelena);    % prevedeme do sedotonoveho dle vztahu
      
      [radku, sloupcu] = size(zelena);
      zelena = imcrop(zelena, [orezzleva+1, oreznahore+1, sloupcu-(orezzleva*2)-1, radku-(oreznahore*2)-1]);    % uprava zelene slozky pro pouziti v redukci
  end

  [radku, sloupcu] = size(jasovka);
  jasovka = imcrop(jasovka, [orezzleva+1, oreznahore+1, sloupcu-(orezzleva*2)-1, radku-(oreznahore*2)-1]);      % orez vstupniho obrazu dle nastavenych parametru
 
%   figure
%   imshow(jasovka)
 
 
%% ----------------- REDUKCE PROHLEDAVANEHO PROSTORU ----------------------
 
 if fundus == 1         % redukce pro snimky z HRF databaze - vstupni obraz je zelena slozka obrazu
    ROImapa = redukce(zelena, sirkaoknax, polomerOD, polomerROI, 1);
 elseif fundus == 2     % redukce pro snimky z DRIONS databaze - vstupni obraz je zelena slozka obrazu
    ROImapa = redukce(zelena, sirkaoknax, polomerOD, polomerROI, 2); 
 else                   % redukce pro snimky z video oftalmoskopu
    ROImapa = redukce(jasovka, sirkaoknax, polomerOD, polomerROI, 0);
 end

 
%% ----------------- PREDZPRACOVANI OBRAZU - az po redukci, aby nebyly v redukci nebyly ovlivneny hrany
if fundus == 1  % predzpracovani pro HRF databazi
    
    struktur = strel('disk', 5,0);          % 5 - kruhovy strukturni element s polomerem 5 px
    jasovka = imclose(jasovka,struktur);    % morfolog. uzavreni
        
elseif fundus == 2  % predzpracovani pro DRIONS databazi
    
    struktur = strel('disk', 15,0);         % 15 - kruhovy strukturni element s polomerem 15 px
    jasovka = imclose(jasovka,struktur);    % morfol. uzavreni
   
else                % predzpracovani pro snimky z video oftalmoskopu
    struktur = strel('disk', 20, 0);        % 20 - kruhovy strukturni element s polomerem 20 px
    uzav = imclose(jasovka,struktur);       % morfol. uzavreni
    
    struktur = strel('disk', 100);          % 100 - kruhovy strukturni element s polomerem 100 px
    open = imopen(uzav, struktur);          % morfol. otevreni
    
    tophat = uzav - open;                   % top-hats transformace

    adjust = imadjust(tophat);              % roztazeni kontrastu
    
    jasovka = medfilt2(adjust, [10 10]);    % medianova filtrace [10 x 10]
    
end

% figure
% imshow(jasovka)
  



%% ----------------- KRUHOVA TRANSFORMACE ---------------------------------
[radku, sloupcu] = size(jasovka);
 
 tic
 maticepozic = tvorbamaticepozic(pocetprimek, vzdalodst);           % vytvoreni matice pozic dle nastavenych parametru - funkce
 t1 = toc;
 
 tic
 PMs = prohledavani(jasovka, maticepozic, pocetprimek, vzdalodst, minvzdalodst, ROImapa); % prohledavani vstupniho predzpracovaneho obrazu - funkce
 t2 = toc;
 
 tic
 PMs = filtracePMs(PMs, FILTRACEPRED, minvzdalodst, pocetprimek);   % filtrace bodu PM (nebo jejich oznaceni) - funkce
 t3 = toc;
 
 tic
 OD = ODmapa(PMs, radku, sloupcu, pocetprimek, zvyhodnit);          % tvorba OD mapy - funkce
 t4 = toc;


%% ----------------- FILTRACE PO DETEKCI STREDU (volitelne)----------------
if FILTRACEPO == 1;

    OD(OD(:,3)<=0,:)=[];    % odstraneni radku (bodu PM) s negativni a nulovou hodnotou variace z OD matice
%    OD(OD(:,3)<0,:)=[];     

    OD(OD(:,6)==0,:)=[];    % odstraneni radku (bodu P) dle vzdalenosti od centralniho pixelu z OD matice - byly oznaceny ve funkci filtrace, zde jednoduche odtraneni oznacenych radku
end

%%----------------- VYPOCET OBRAZOVYCH SOURADNIC z OD MATICE + SYMETRIE----
sourad = souradnice(OD, pocetprimek, maticepozic, oreznahore, orezzleva); % z OD matice je vytvorena matice obrazovych souradnic hranicnich pixelu + stredova symetrie bodu PM - funkce


%%----------------- kontrolni volitelne vykresleni jednotlivych bodu PM (hranicnich bodu) a stredu OD do obrazu (JEN PRO MATLAB 2013a A NOVEJSI!)
%     znacky = insertMarker(obr,sourad, 'size', 1);                                 % vlozeni bodu PM
%     znacky = insertMarker(obr,[OD(1,2)+orezzleva OD(1,1)+oreznahore],'size', 3);  % vlozeni stredu OD
%     figure
%     imshow(znacky)


%%------------------ VYKRESLENI HRANICE DO OBRAZU + VYHODNOCENI PRESNOSTI--
sourad = sourad.*(1/zmenseniobr);           % nasobeni souradnic prevracenou hodnotou zmenseni - aby souradnice odpovidaly nezmensenemu vstupnimu obrazu
if vyhodnotit == 1                          % pokud je zapnuto vyhodnoceni
    [senzitivita, specificita, presnost, prekryti, vysledek, vyslednevrcholy] = vyhodnoceni(sourad, vrcholy, obraz);   % provede se vykresleni referencni a detekovane hranice a soucasne vypoctu hodnoticich parametru
else                                        % pokud neni zapnuto vyhodnoceni                                                          
    [vysledek, vyslednevrcholy] = vykresleni(sourad, obraz);    % provadi se jen vykresleni detekovane hranice do vstupniho obrazu - funkce
end
    
% figure
% imshow(vysledek)

end
 