function varargout = spust(varargin)
% HLAVNI SPOUSTECI SOUBOR 
% spustenim se otevre graficke okno s uzivatelskym prostredim
















% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @spust_OpeningFcn, ...
                   'gui_OutputFcn',  @spust_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

% End initialization code - DO NOT EDIT


% --- Executes just before spust is made visible.
function spust_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to spust (see VARARGIN)

% Choose default command line output for spust
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

global jmeno;
global slozka;
global typ;
global vyslednyobr;
global vyslednesourad;
global senz;
global spec;
global presn;
global prekr;
jmeno = 0;
slozka = 0;
typ = 0;
vyslednyobr = [];
vyslednesourad = [];
senz = [];
spec = [];
presn = [];
prekr = [];

set(handles.uipanel1,'visible','off')
set(handles.poskozeni,'visible','off');
set(handles.poskozenitext,'visible','off');
set(handles.napoveda,'string', 'Stisknete tlacitko NACTI OBRAZ a zvolte obraz, ktery chcete zpracovat');


% UIWAIT makes spust wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = spust_OutputFcn(hObject, eventdata, handles) 

varargout{1} = handles.output;


% --- Executes on button press in nacist.
function nacist_Callback(hObject, eventdata, handles)

if get(handles.vyhodnoceni,'Value') == 0
   set(handles.uipanel1,'visible','off')
end

global jmeno;
global slozka;
global typ;

aktual = mfilename('fullpath');
[jmeno, slozka] = uigetfile({'*.jpg;*.tif'},'Zvolte fotografii',strcat(aktual(1:end-14),'\Data\vstupni data\'));  % volba testovaci fotografie

if jmeno == 0
    return
end

cesticka = strcat(slozka,jmeno);                                % slozeni cesty k fotografii
obr = imread(cesticka);
axes(handles.axes1)
imshow(obr)

set(handles.nazevsnimku,'string',jmeno(1:end-4));

if size(obr,3) == 3 && size(jmeno,2) >= 8
    if strcmp(jmeno(3:8),'_dr.JP') == 1
        set(handles.poskozeni,'visible','on');
        set(handles.poskozenitext,'visible','on');
        set(handles.poskozeni,'string', 'Poskozena diabetickou retinopatii')
    elseif strcmp(jmeno(3:8),'_g.jpg') == 1
        set(handles.poskozeni,'visible','on');
        set(handles.poskozenitext,'visible','on');
        set(handles.poskozeni,'string', 'Poskozena glaukomem')
    elseif strcmp(jmeno(3:8),'_h.jpg') == 1
        set(handles.poskozeni,'visible','on');
        set(handles.poskozenitext,'visible','on');
        set(handles.poskozeni,'string', 'Zdrava')
    else 
        set(handles.poskozeni,'visible','off');
        set(handles.poskozenitext,'visible','off');
    end
else
        set(handles.poskozeni,'visible','off');
        set(handles.poskozenitext,'visible','off');
end
set(handles.napoveda,'string', 'Zvolte typ vstupniho obrazu: HRF databaze, DRIONS databaze, video oftalmoskop');

if (size(obr,1) == 2336)
    typ = 'HRF';
elseif (size(obr,1) == 480)
    typ = 'oftal';
elseif (size(obr,1) == 400)
    typ = 'DRIONS';
end

set(handles.edit2,'string',num2str(0));     % vynulovani vysledku pri opetovnem spusteni vyhodnoceni
set(handles.edit3,'string',num2str(0));
set(handles.edit4,'string',num2str(0));
set(handles.edit5,'string',num2str(0));

global vyslednyobr; 
global vyslednesourad;
global presn;
vyslednyobr = [];
vyslednesourad = [];
presn = [];
    





% --- Executes on button press in spust.
function spust_Callback(hObject, eventdata, handles)

set(handles.napoveda,'string', 'PROBIHAJI VYPOCTY');

global jmeno;
global slozka;

if jmeno == 0
   msgbox({'Neni nacteny zadny obraz!' 'Pred spustenim je nutne nacist vstupni obraz'...
       'Pokud jste obraz nacetli, prosim opakujte akci.'},'Chyba', 'error');
   set(handles.napoveda,'string', 'Nactete obraz tlacitkem NACTI OBRAZ');
   return    
end


kontrola = imread(strcat(slozka,jmeno));
if (size(kontrola,1) == 2336) && (get(handles.HRF, 'Value') == 0)
    tlacitko = questdlg('Jste si jisti, ze nezpracovavate obraz z HRF databaze?',...
        'Pozor', 'Ano','Ne','Nevim', 'Ne');
    if (strcmp(tlacitko,'Ne') == 1) || (strcmp(tlacitko,'Nevim') == 1) || (isempty(tlacitko) == 1)
        msgbox('Prosim zatrhnete volbu HRF databaze','Info', 'help');
        set(handles.napoveda,'string', 'Zaskrtnete volbu HRF databaze');
        return;
    end
end

if (size(kontrola,1) == 480) && (get(handles.oftalmoskop, 'Value') == 0)
    tlacitko = questdlg('Jste si jisti, ze nezpracovavate obraz z video oftalmoskopu?',...
        'Pozor', 'Ano','Ne','Nevim', 'Ne');
    if (strcmp(tlacitko,'Ne') == 1) || (strcmp(tlacitko,'Nevim') == 1) || (isempty(tlacitko) == 1)
        msgbox('Prosim zaskrtnete volbu video oftalmoskop','Info', 'help');
        set(handles.napoveda,'string', 'Zaskrtnete volbu Video oftalmoskop');
        return;
    end
end

if (size(kontrola,1) == 400) && (get(handles.DRIONS, 'Value') == 0)
    tlacitko = questdlg('Jste si jisti, ze nezpracovavate obraz z DRIONS databaze?',...
        'Pozor', 'Ano','Ne','Nevim', 'Ne');
    if (strcmp(tlacitko,'Ne') == 1) || (strcmp(tlacitko,'Nevim') == 1) || (isempty(tlacitko) == 1)
        msgbox('Prosim zaskrtnete volbu DRIONS databaze','Info', 'help');
        set(handles.napoveda,'string', 'Zaskrtnete volbu DRIONS databaze');
        return;
    end
end


if get(handles.HRF, 'Value') == 1
    fundus = 1;
elseif get(handles.DRIONS, 'Value') == 1
    fundus = 2;
else 
    fundus = 0;
end

global vyslednesourad;
global vyslednyobr;



if get(handles.vyhodnoceni,'Value') == 0;       % pokud nechceme vyhodnoceni
    set(handles.uipanel1,'visible','off')
    
        [vyslednyobr, vyslednesourad] = main(strcat(slozka,jmeno), fundus, 0); 

else                                            % pokud chceme vyhodnoceni
    if (get(handles.oftalmoskop, 'Value') == 1) && (size(jmeno,2) >= 28)
        jmenokontur = jmeno(1:28);
        dodatek = '_OD_contour.txt';  
    elseif (get(handles.HRF, 'Value') == 1)
        jmenokontur = jmeno(1:end-4);
        dodatek = '_OD_contour.txt';  
    elseif (get(handles.DRIONS, 'Value') == 1)
        jmenokontur = strcat('anotExpert1_',jmeno(7:9));
        dodatek = '.txt';  
    end
      
    
    cestakontur = strcat(slozka,'OD contour\',jmenokontur,dodatek);                                % slozeni cesty k souboru
    
    if exist(cestakontur, 'file') ~= 2  % pokud soubor neexistuje, nebo se nenachazi v predpokladanem umisteni, je nutne zadat cestu rucne
        msgbox({'Referencni kontura nebyla nalezena.'...
            'Prosim vyberte odpovidajici soubor rucne.'},'Pozor','warn'); 
        uiwait;
        
        [jmenokontur, slozkakontur] = uigetfile(strcat(slozka,'\OD contour\.txt'),...
            'Prosim zvolte odpovidajici soubor');  
        if jmenokontur == 0
            msgbox({'Nebyl spravne zvolen soubor s referencni konturou'...
                'Pokud soubor neexistuje, prosim odskrtnete pro tento obraz volbu vyhodnoceni presnosti'},'Pozor', 'warn');
            set(handles.napoveda,'string', 'Odskrtnete volbu VYHODNOCENI PRESNOSTI a spustte program tlacitkem SPUSTIT');
            return
        end
        cestakontur = strcat(slozkakontur,jmenokontur);
    end
    
    set(handles.edit2,'string',num2str(0));     % vynulovani vysledku pri opetovnem spusteni vyhodnoceni
    set(handles.edit3,'string',num2str(0));
    set(handles.edit4,'string',num2str(0));
    set(handles.edit5,'string',num2str(0));
    
    vrcholy = load(cestakontur);
    
    [vyslednyobr, vyslednesourad, senzitivita, specificita, presnost, prekryti] = main(strcat(slozka,jmeno),fundus, 1, vrcholy); 
    
    
    global senz;
    global spec;
    global presn;
    global prekr;
    
    senz = round(senzitivita, 2);
    spec = round(specificita, 2);
    presn = round(presnost, 2);
    prekr = round(prekryti, 2);
    
    
    set(handles.edit2,'string',num2str(senz));
    set(handles.edit3,'string',num2str(spec));
    set(handles.edit4,'string',num2str(presn));
    set(handles.edit5,'string',num2str(prekr));
    set(handles.uipanel1,'visible','on')
    
    
end

axes(handles.axes1)
imshow(vyslednyobr)

if get(handles.HRF, 'Value') == 1
    set(handles.napoveda,'string', ['KONTURA VYKRESLENA. U obrazu z HRF databaze se vykreslena kontura muze jevit prerusovane.', ...
        'Je to dano vysokym rozlisenim techto obrazu a jednotkovou tloustkou vykreslene kontury. Tento problem lze vyresit priblizenim kontury nastrojem ZOOM IN vlevo nahore nad vykreslenym obrazem.']);
else
    set(handles.napoveda,'string', 'VYPOCTY DOKONCENY. Vystupni obraz, hranici a pripadne vysledne hodnotici parametry lze nyni ulozit tlacitky pod timto textem.');
end








% --- Executes on button press in zobrazitkonturu.
function zobrazitkonturu_Callback(hObject, eventdata, handles)

set(handles.uipanel1,'visible','off')

global jmeno;
global slozka;

if jmeno == 0
   msgbox({'Neni nacteny zadny obraz!' 'Pred spustenim je nutne nacist vstupni obraz'...
       'Pokud jste obraz nacetli, prosim opakujte akci.'},'Chyba', 'error');
   set(handles.napoveda,'string', 'Nactete obraz tlacitkem NACTI OBRAZ');
   return    
end

if get(handles.vyhodnoceni, 'Value') == 1
    msgbox({'Pri zobrazeni referencni kontury nelze provest vyhodnoceni'...
        'Prosim odskrtnete volbu Vyhodnoceni presnosti'},'Info', 'warn');
    set(handles.napoveda,'string', 'Odskrtnete volbu VYHODNOCENI PRESNOSTI');
    return
end

obr = im2double(imread(strcat(slozka,jmeno)));
if (size(obr,1) == 2336) && (get(handles.HRF, 'Value') == 0)
    tlacitko = questdlg('Jste si jisti, ze nezpracovavate obraz z HRF databaze?',...
        'Pozor', 'Ano','Ne','Nevim', 'Ne');
    if (strcmp(tlacitko,'Ne') == 1) || (strcmp(tlacitko,'Nevim') == 1) || (isempty(tlacitko) == 1)
        msgbox('Prosim zatrhnete volbu HRF databaze','Info', 'help');
        set(handles.napoveda,'string', 'Zatrhnete volbu HRF databaze');
        return;
    end
end

if (size(obr,1) == 480) && (get(handles.oftalmoskop, 'Value') == 0)
    tlacitko = questdlg('Jste si jisti, ze nezpracovavate obraz z video oftalmoskopu?',...
        'Pozor', 'Ano','Ne','Nevim', 'Ne');
    if (strcmp(tlacitko,'Ne') == 1) || (strcmp(tlacitko,'Nevim') == 1) || (isempty(tlacitko) == 1)
        msgbox('Prosim zaskrtnete volbu video oftalmoskop','Info', 'help');
        set(handles.napoveda,'string', 'Zatrhnete volbu Video oftalmoskop');
        return;
    end
end

if (size(obr,1) == 400) && (get(handles.DRIONS, 'Value') == 0)
    tlacitko = questdlg('Jste si jisti, ze nezpracovavate obraz z DRIONS databaze?',...
        'Pozor', 'Ano','Ne','Nevim', 'Ne');
    if (strcmp(tlacitko,'Ne') == 1) || (strcmp(tlacitko,'Nevim') == 1) || (isempty(tlacitko) == 1)
        msgbox('Prosim zaskrtnete volbu DRIONS databaze','Info', 'help');
        set(handles.napoveda,'string', 'Zatrhnete volbu DRIONS databaze');
        return;
    end
end

if (get(handles.oftalmoskop, 'Value') == 1) && (size(jmeno,2) >= 28)
        jmenokontur = jmeno(1:28);
        dodatek = '_OD_contour.txt';  
elseif (get(handles.HRF, 'Value') == 1)
        jmenokontur = jmeno(1:end-4);
        dodatek = '_OD_contour.txt';  
elseif (get(handles.DRIONS, 'Value') == 1)
        jmenokontur = strcat('anotExpert1_',jmeno(7:9));
        dodatek = '.txt';  
end    

cestakontur = strcat(slozka,'OD contour\',jmenokontur,dodatek);                                % slozeni cesty k souboru
    
if exist(cestakontur, 'file') ~= 2  % pokud soubor neexistuje, nebo se nenachazi v predpokladanem umisteni, je nutne zadat cestu rucne
    msgbox({'Referencni kontura nebyla nalezena.'...
        'Prosim vyberte odpovidajici soubor rucne.'},'Info','error');
    uiwait;
    
    [jmenokontur, slozkakontur] = uigetfile(strcat(slozka,'\OD contour\.txt'),...
        'Prosim zvolte odpovidajici soubor');
    if jmenokontur == 0
        msgbox({'Nebyl spravne zvolen soubor s referencni konturou'...
            'Pokud soubor neexistuje, prosim odskrtnete pro tento obraz volbu Vyhodnoceni presnosti'},'Pozor', 'warn');
        set(handles.napoveda,'string', 'Odskrtnete volbu VYHODNOCENI PRESNOSTI');
        return
    end
    cestakontur = strcat(slozkakontur,jmenokontur);
end

vrcholy = load(cestakontur);

global vyslednyobr;
vyslednyobr = vykresleni(vrcholy, obr);

axes(handles.axes1)
imshow(vyslednyobr)

if get(handles.HRF, 'Value') == 1
    set(handles.napoveda,'string', ['KONTURA VYKRESLENA. U obrazu z HRF databaze se vykreslena kontura muze jevit prerusovane.', ...
        'Je to dano vysokym rozlisenim techto obrazu a jednotkovou tloustkou vykreslene kontury. Tento problem lze vyresit priblizenim kontury nastrojem ZOOM IN vlevo nahore nad vykreslenym obrazem.']);
else
    set(handles.napoveda,'string', 'KONTURA VYKRESLENA');
end

global vyslednesourad;
global presn;
presn = [];
vyslednesourad = [];




% --- Executes on button press in HRF.
function HRF_Callback(hObject, eventdata, handles)
set(handles.DRIONS,'Value', 0);
set(handles.oftalmoskop,'Value', 0);

global typ;

if strcmp(typ,'HRF') == 0
    set(handles.napoveda,'string', ['Pravdepodobne mate zvoleny spatny typ vstupniho obrazu!  Prosim prekontrolujte vasi volbu.  ', ...
        'Pokud je vase volba spravna, pokracujte stiskem tlacitka SPUSTIT']);
else
    set(handles.napoveda,'string', ['V pripade, ze chcete vyhodnotit uspesnost detekce optickeho disku, zatrhnete volbu VYHODNOCENI PRESNOSTI a pote tlacitko SPUSTIT. ',...
        'Pokud chcete pouze detekovat opticky disk, stisknete tlacitko SPUSTIT. ', 'Pro zobrazeni referencni kontury stisknete ZOBRAZIT REFERENCNI KONTURU.']);
end




% --- Executes on button press in vyhodnoceni.
function vyhodnoceni_Callback(hObject, eventdata, handles)
if get(handles.vyhodnoceni, 'Value') == 1
    set(handles.napoveda,'string', 'Nyni stisknete tlacitko SPUSTIT.');
else
    set(handles.napoveda,'string', 'Nyni stisknete tlacitko SPUSTIT, nebo tlacitko ZOBRAZIT REFERENCNI KONTURU');
end


function edit2_Callback(hObject, eventdata, handles)


% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


function edit3_Callback(hObject, eventdata, handles)


% --- Executes during object creation, after setting all properties.
function edit3_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


function edit4_Callback(hObject, eventdata, handles)


% --- Executes during object creation, after setting all properties.
function edit4_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


function edit5_Callback(hObject, eventdata, handles)


% --- Executes during object creation, after setting all properties.
function edit5_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes when figure1 is resized.
function figure1_SizeChangedFcn(hObject, eventdata, handles)


% --- Executes on button press in oftalmoskop.
function oftalmoskop_Callback(hObject, eventdata, handles)

set(handles.HRF,'Value', 0);
set(handles.DRIONS,'Value', 0);
global typ;

if strcmp(typ,'oftal') == 0
    set(handles.napoveda,'string', ['Pravdepodobne mate zvoleny spatny typ vstupniho obrazu!  Prosim prekontrolujte vasi volbu.  ', ...
        'Pokud je vase volba spravna, pokracujte stiskem tlacitka SPUSTIT']);
else
    set(handles.napoveda,'string', ['V pripade, ze chcete vyhodnotit uspesnost detekce optickeho disku, zatrhnete volbu VYHODNOCENI PRESNOSTI a pote tlacitko SPUSTIT. ',...
        'Pokud chcete pouze detekovat opticky disk, stisknete tlacitko SPUSTIT. ', 'Pro zobrazeni referencni kontury stisknete ZOBRAZIT REFERENCNI KONTURU.']);
end


% --- Executes on button press in DRIONS.
function DRIONS_Callback(hObject, eventdata, handles)

set(handles.HRF,'Value', 0);
set(handles.oftalmoskop,'Value', 0);
global typ;

if strcmp(typ,'DRIONS') == 0
    set(handles.napoveda,'string', ['Pravdepodobne mate zvoleny spatny typ vstupniho obrazu!  Prosim prekontrolujte vasi volbu.  ', ...
        'Pokud je vase volba spravna, pokracujte stiskem tlacitka SPUSTIT']);
else
    set(handles.napoveda,'string', ['V pripade, ze chcete vyhodnotit uspesnost detekce optickeho disku, zatrhnete volbu VYHODNOCENI PRESNOSTI a pote tlacitko SPUSTIT. ',...
        'Pokud chcete pouze detekovat opticky disk, stisknete tlacitko SPUSTIT. ', 'Pro zobrazeni referencni kontury stisknete ZOBRAZIT REFERENCNI KONTURU.']);
end


% --- Executes on button press in ulozobr.
function ulozobr_Callback(hObject, eventdata, handles)
global vyslednyobr;
global jmeno;

if isempty(vyslednyobr) == 0
    aktual = mfilename('fullpath');
    [nam, dir] = uiputfile({'*.png';'*.jpg';'*.tif'},'Zadejte umisteni a nazev',strcat(aktual(1:end-14),'\Data\vystupy\obrazy\',jmeno(1:end-4), '_kontura'));
    if nam == 0
        return
    end
    imwrite(vyslednyobr, strcat(dir,nam));
    
    set(handles.napoveda,'string', 'Ulozeni obrazu dokonceno');
else
    msgbox({'Obraz neni zpracovan (neni vykreslena kontura), neni tak co ukladat!'... 
        'Pred ulozenim snimku nejprve spustte vypocet nebo zobrazte referencni hranici.'},'Chyba', 'error');
end


% --- Executes on button press in ulozhranici.
function ulozhranici_Callback(hObject, eventdata, handles)
global vyslednesourad;
global jmeno;

if isempty(vyslednesourad) == 0
    aktual = mfilename('fullpath');
    [nam, dir] = uiputfile('*.txt','Zadejte umisteni a nazev', strcat(aktual(1:end-14),'\Data\vystupy\hranice\',jmeno(1:end-4),'_hranice'));
    if nam == 0
        return
    end
    dlmwrite(strcat(dir,nam), vyslednesourad, 'delimiter','\t', 'newline', 'pc');
    
    set(handles.napoveda,'string', 'Ulozeni hranice OD dokonceno');
else
    msgbox({'Obraz neni zpracovan (neni vykreslena kontura, nebo je vykreslena pouze referencni kontura), neni tak co ukladat!'... ');
        'Pred ulozenim vysledne hranice nejprve spustte vypocet tlacitkem SPUSTIT.'},'Chyba', 'error');
end


% --- Executes on button press in ulozvysledky.
function ulozvysledky_Callback(hObject, eventdata, handles)
global senz;
global spec;
global presn;
global prekr;
global jmeno;

if isempty(presn) == 0
    aktual = mfilename('fullpath');
    [nam, dir] = uiputfile('*.txt','Zadejte umisteni a nazev', strcat(aktual(1:end-14),'\Data\vystupy\vysledky\',jmeno(1:end-4),'_vysledek'));
    if nam == 0
        return
    end

    textak = fopen(strcat(dir,nam),'w');
    fprintf(textak, '%s\t%s\t%s\t%s\r\n', 'SN','SP','ACC','OL');
    fprintf(textak, '%.2f\t%.2f\t%.2f\t%.2f\r\n', senz,spec,presn,prekr);
    fclose(textak);
    
    set(handles.napoveda,'string', 'Ulozeni vysledku dokonceno');
    
else
    msgbox({'Neni udelano vyhodnoceni, neni tak co ukladat!'... ');
        'Pred ulozenim vyslednych parametru nejprve spustte vypocet se zatrhnutou volbou VYHODNOCENI PRESNOSTI.'},'Chyba', 'error');
end
