function [SN, SP, ACC, Overlap, vysledek, vyslednevrcholy] = vyhodnoceni(vrcholyAutom, vrcholyReferenc, vstupniobr)
% funkce pro vyhodnoceni presnosti segmentace - senzitivita, specificita,
% presnost a prekryti (overlap)
% funkce jednak vyhodnoti vyse zminene funkce, jednak take vykresluje
% hranici OD do vstupniho obrazu

% VSTUP:
% - vrcholyAutom - souradnice vrcholu hranice OD, ktere byly ziskany
%   kruhovou transformaci
% - vrcholyReferenc - souradnice vrcholu hranice OD, ktere byly nalezene
%   rucne - jde o referencni body, ktere jsou povazovany za spravne reseni
% - vstupniobr - vstupni obraz - slouzi pro vykresleni hranice

% VYSTUP:
% - SN - senzitivita - vysledna vypoctena hodnota senzitivity v %
% - SP - specificita - vysledna vypoctena hodnota specificity v %
% - ACC - presnost - vysledna vypoctena hodnota presnosti v %
% - Overlap - prekryti - vysledna vypoctena hodnota prekryti v %
% - vysledek - vysledny obraz s vykreslenymi hranicemi
% - vyslednevrcholy - matice obsahujici souradnice vyhlazene hranice (hranicni pixely optickeho
%    disku) - v kazdem radku jeden pixel


    oblastAutom = roipoly(vstupniobr, vrcholyAutom(:,1), vrcholyAutom(:,2));        % vytvoreni binarniho obrazu (OD oblasti) z dodanych vrcholu z kruhove transformace
    oblastReferenc = roipoly(vstupniobr, vrcholyReferenc(:,1), vrcholyReferenc(:,2));  % vytvoreni binarniho obrazu (OD oblasti) z dodanych referencnich vrcholu 
    
    if size(vstupniobr,1) == 2336
        vyhlazeni = 50;                     % nastaveni hodnoty vyhlazeni dle typu vstupniho obrazu
    elseif size(vstupniobr,1)== 480
        vyhlazeni = 20;                     % nastaveni hodnoty vyhlazeni dle typu vstupniho obrazu
    else 
        vyhlazeni = 10;                     % nastaveni hodnoty vyhlazeni dle typu vstupniho obrazu
    end
    
    ztencenyAutom = edge(oblastAutom, 'Canny', [], vyhlazeni);          % vytvoreni hranice binarniho obrazu pomoci cannyho detektoru + soucasne vyhlazeni hranice
    ztencenyReferenc = edge(oblastReferenc, 'Canny', [], vyhlazeni);    % vytvoreni hranice binarniho obrazu pomoci cannyho detektoru + soucasne vyhlazeni hranice
        
        
    if size(vstupniobr,3) == 3  % pokud je obraz RGB a ne sedotonovy
        
          vysledek(:,:,1) = vstupniobr(:,:,1) - ztencenyAutom - ztencenyReferenc;   % zakresleni vyslednych hranic do obrazu
          vysledek(:,:,2) = vstupniobr(:,:,2) + ztencenyAutom - ztencenyReferenc;   % zakresleni je provadeno superpozici (jednoduche pricteni)
          vysledek(:,:,3) = vstupniobr(:,:,3) - ztencenyAutom + ztencenyReferenc;   % v jednotlivych barevnych slozkach pro jejich barevne odliseni    
                        
    else                        % v pripade sedotonoveho obrazu
          vysledek(:,:,1) = vstupniobr;                     % opet zakresleni vyslednych hranic do obrazu
          vysledek(:,:,2) = vstupniobr + ztencenyAutom;     % automaticka hranice prictena do zelene slozky - bude tedy zelena
          vysledek(:,:,3) = vstupniobr + ztencenyReferenc;  % referencni hranice prictena do modre slozky - bude tedy modra
        
    end
    
    %figure
    %imshowpair(vysledekAutom,vysledekReferenc, 'falsecolor');   % zobrazeni
    
    ztencenyAutom = imdilate(ztencenyAutom, strel('disk', 1, 0));           % pomocna dilatace pro vyplneni pripadnych mezer v hranici
    ztencenyReferenc = imdilate(ztencenyReferenc, strel('disk', 1, 0));     % pomocna dilatace pro vyplneni pripadnych mezer v hranici

    vyhlazROIautom = imfill(ztencenyAutom, 'holes');        % vypleni hranic zpet na vyplnenou binarni automatickou oblast (oproti pocatku je ale vyhlazena)
    vyhlazROIreferenc = imfill(ztencenyReferenc, 'holes');  % vyplneni hranic zpet na vyplnenou binarni referencni oblast (oproti pocatku je ale vyhlazena)


    % Vytvoreni jednotlivych oblasti potrebnych pro vysledne vypocty:
    TP = vyhlazROIautom & vyhlazROIreferenc; % TP - true positive - prekryti mezi ground truth (reference) a automatickym vysledkem
    
    FP = vyhlazROIautom - vyhlazROIreferenc; % FP - false positive - oblast oznacena automaticky, ktera se neshoduje s referenci
    FP(FP(:) < 0) = 0;                       % pomocne vynulovani zapornych prvku vzniklych po odecteni
    FP = logical(FP);                       
    
    FN = vyhlazROIreferenc - vyhlazROIautom;% FN - false negative - referencni (platna) oblast OD, ktera neni prekryta automatickym vysledkem
    FN(FN(:) < 0) = 0;                      % pomocne vynulovani zapornych prvku vzniklych po odecteni
    FN = logical(FN);
    
    TN = 1 - (vyhlazROIautom | vyhlazROIreferenc);% TN - true negative - oblast, ktera neprislusi OD a je tak automaticky spravne oznacena (oblast mimo referenci a také automatické označení)
    TN = logical(TN);
    
%     figure
%     imshow(TP)
%     figure
%     imshow(FP)
%     figure
%     imshow(FN)
%     figure
%     imshow(TN)

    TPpx = sum(TP(:));      % velikost oblasti TP (v pixelech)
    FPpx = sum(FP(:));      % velikost oblasti FP (v pixelech)
    FNpx = sum(FN(:));      % velikost oblasti FN (v pixelech)
    TNpx = sum(TN(:));      % velikost oblasti TN (v pixelech)

    SN = (TPpx/(TPpx + FNpx))*100;    % SENZITIVITA
    SP = (TNpx/(TNpx + FPpx))*100;    % SPECIFICITA

    ACC = ((TPpx + TNpx) / (TPpx + FNpx + TNpx + FPpx))*100;   % PŘESNOST
    Overlap = (TPpx/(TPpx + FNpx + FPpx))*100;                 % PŘEKRYTÍ
    
    
    vyslednevrcholy = bwboundaries(ztencenyAutom, 8,'noholes');     % zjisteni souradnic vrcholu hranicnich pixelu vysledne vyhlazene hranice
    vyslednevrcholy = vyslednevrcholy{1};                           % zvoleni prvni a jedine oblasti neboli OD
    vyslednevrcholy = fliplr(vyslednevrcholy);                      % opet prehozeni x a y z duvodu konvence
    
end