%ukážka funkcie detektoru pre anatomickú štruktúru meatus acusticus
%externus (MAE) konkrétne ide o pravú stranu
clc
clear all
close all

load('MAE_databaza_augment.mat'); %načítanie tréningovej databázy
l=length(vysledok_negativne); %pocet snímok v databázy negatívne detekcie

w=size(vysledok_pozitivne{1},1); %veľkosť anat. štruktúry
h=size(vysledok_pozitivne{1},2);

cellSize=4; %veľkosť parametru cellsize pre extractHOGFeatures

%EXTRAKCIA NEGATÍVNYCH PRIZNAKOV PRE TRENING KLASIFIKÁTORA
for k=1:l
    bunka=vysledok_negativne{k}; %vyberie zaradom všetky obrazy z databázy
    [featureVector,hogVisualization] = extractHOGFeatures(bunka,'CellSize',[cellSize cellSize]);
    %extrakcia HOG príznakov z daného obrazu
    v1=length(featureVector);
    Priznakovy_vektor_neg(k,:)=featureVector(1,:); %vždy sa na daný riadok uloží daný
end

 %EXTRAKCIA POZITÍVNYCH PRIZNAKOV PRE TRENING KLASIFIKÁTORA
m=length(vysledok_pozitivne);
for k=1:m 
    bunka=vysledok_pozitivne{k};
    [featureVector,hogVisualization]=extractHOGFeatures(bunka,'CellSize',[cellSize cellSize]);
    v2=length(featureVector);
    Priznakovy_vektor_poz(k,:)=featureVector(1,:); %vždy sa na daný riadok uloží daný
end


neg=length(vysledok_negativne);
poz=length(vysledok_pozitivne);

neg_titles = strings(neg,1);
for i=1:neg
    neg_titles(i)='negativne';
end

poz_titles = strings(poz,1);
for i=1:poz
    poz_titles(i)='pozitivne';
end

%negativne_titles = zeros(neg,1);
%pozitivne_titles = ones(poz,1);
% v prípade označenia tried ako 0 a 1

feature_titles=[neg_titles;poz_titles]; %spojenie popisov
features=[Priznakovy_vektor_neg;Priznakovy_vektor_poz]; %spojenie príznakov

classifier=fitcecoc(features,feature_titles); %trénovanie klasifikatora

pacienti = {'data_46.mat' 'data_47.mat'};
vysledky = {};

for pac=1:size(pacienti,2)
    pacient = load(pacienti{pac});
    pacient = struct2cell(pacient)
    pacient = pacient{1};
    pocetRezov = size(pacient,3);
    vsetkyH = [];
    maxH = 0;
    maxREZ = 0;
    
    %post-processing
    %maximálne zastúpenie tmavých pixelov = posledny obraz 
    jeden_rez=pacient(:,:,pocetRezov); 
    %normalizacia
    bunka = uint8(255 .* ((double(jeden_rez)-min(jeden_rez(:)))) ./ (max(jeden_rez(:)-min(jeden_rez(:)))));% normalizacia
    blackMax=length(bunka(bunka<30))/(512*512); 
     %minimálne zastúpenie tmavých pixelov = prvy obraz
    jeden_rez=pacient(:,:,1); 
    bunka = uint8(255 .* ((double(jeden_rez)-min(jeden_rez(:)))) ./ (max(jeden_rez(:)-min(jeden_rez(:)))));% normalizacia
    blackMin=length(bunka(bunka<30))/(512*512);

    %dynamicke nastavenie odstranenia určitého počtu posledných rezov
   threshold = blackMax-((blackMax-blackMin)*0.9);
    
    for rez=1:1:pocetRezov
        tic
        jeden_rez=pacient(:,:,rez); 
        bunka = uint8(255 .* ((double(jeden_rez)-min(jeden_rez(:)))) ./ (max(jeden_rez(:)-min(jeden_rez(:)))));% normalizacia
        black=length(bunka(bunka<30))/(512*512);
        if black < threshold %ak je na reze zastupenie tmavych pixelov mensie ako threshold
            bunka=jeden_rez;
             s=12; %krok
            [r,c]=size(bunka); %velkost rezu
            %H=zeros(r,c);
            Hf=zeros(r,c);
            r=floor((r-h)/s)+1; %kolko krokov sa zmestí na výšku
            c=floor((c-w)/s)+1; %kolko krokov sa zmestí na šírku
            r=r*s; %koniec rezu
            c=c*s;
            r1=1;             %pociatocná inicializácia súradnic
            c1=1;
            for n=1:s:c
                for m=1:s:r
                    img=bunka(n:n+(w-1),m:m+(h-1)); %výrez okna        
                    z=img;        
                    img = uint8(255 .* ((double(img)-min(img(:)))) ./ (max(img(:)-min(img(:)))));% normalizacia
                    img=extractHOGFeatures(img,'CellSize',[cellSize cellSize]);
                    [pred,scores]=predict(classifier,img);       
                    Hf(n,m)= -scores(1);        
                end    
            end  
            if maxH < max(Hf(:)) %ak bolo predchadzajuce maximum mensie prepise sa 
                [suradnicaRow,suradnicaCol]=find(max(Hf(:))==Hf); %najde suradnice maxima
                maxREZ = rez; %zapise rez na ktorom sa maximum nachadza
                maxH = max(Hf(:)) %prepis na nove maximum
            end
            max(Hf(:))
            %[rowShow,co1Show]=find(max(Hf(:))==Hf); %pre vykreslovanie
            %detekcie v každom reze
            jeden_rez=pacient(:,:,maxREZ); 
            jeden_rez = uint8(255 .* ((double(jeden_rez)-min(jeden_rez(:)))) ./ (max(jeden_rez(:)-min(jeden_rez(:)))));% normalizacia
   
    oznaceny_rez = insertShape(jeden_rez,'Rectangle',[suradnicaCol suradnicaRow (h-1) (w-1)],'LineWidth',3);
      %vyznačenie bounding boxu
    imshow(oznaceny_rez);
        end
        rez
        toc
    end  
vysledky{pac} = [suradnicaRow suradnicaCol maxREZ];%do výsledkov sa  ulozi najlepsia detekcia -
%t.j. súradnica x a y bounding boxu (lavy horny roh a rez na ktorom sa
%nachazda
clear Hf H
end

for pac=1:size(pacienti,2)
    vysledok=vysledky{pac}   
   
    pacient = load(pacienti{pac});
    pacient = struct2cell(pacient)
    pacient = pacient{1};
   
    jeden_rez=pacient(:,:,vysledok(3));  %rez na ktorom sa detekcia nachadza
    bunka = uint8(255 .* ((double(jeden_rez)-min(jeden_rez(:)))) ./ (max(jeden_rez(:)-min(jeden_rez(:)))));% normalizacia
    bunka = insertShape(bunka,'Rectangle',[vysledok(2) vysledok(1) (h-1) (w-1)],'LineWidth',3);  
    %vloženie bounding boxu
    figure(pac)
    imshow(bunka);
    title(strcat('Pacient: ',string(pac)));
    %imwrite(bunka,'detekcia_zvukovod.png','png','Comment','My JPEG file') %ulozenie detekcie ako png
   % w = waitforbuttonpress;
end

