%diplomová práce - tento skript vypočítává příznaky pro trenování sítě a
%probíhá zde samotné trénování sítě.
clear all
clc
close all

fname='C:\skola\pokus\data\Svobodova\'; %nastavení cesty k datum
index=1;

%vytvoření jednotlivých masek pro vytvoření následné odezvy
[maska0,maska15,maska30,maska45,maska60,maska75,maska90,maska105,maska120,maska135,maska150,maska165]= cevy(); %ziska masek pro tlusté cévy
[maska_st0,maska_st15,maska_st30,maska_st45,maska_st60,maska_st75,maska_st90,maska_st105,maska_st120,maska_st135,maska_st150,maska_st165] = cevy2(); %zisk masek pro středně tlusté cévy
[maska_t0,maska_t15,maska_t30,maska_t45,maska_t60,maska_t75,maska_t90,maska_t105,maska_t120,maska_t135,maska_t150,maska_t165] = cevy3(); %zisk masek pro tenke cévy


num=0; %celkove pixelu v obrazku 

for (i=1:10) %1 až 10. složka 
    %%obrazky
    if(i<10)
    fname2=[fname '0' num2str(i)]; % vyber jednotlivých složek 
    else
    fname2=[fname num2str(i)]; 
    end
    A=dir(fname2); % vypíšou se jednotlivá data, co se nachází ve složce 
    
    %%načtení labelu
         if(i==1)
    fname3=['C:\skola\pokus\PixelLabelData']; % vyber složky s anotacemi
    else
    fname3=['C:\skola\pokus\PixelLabelData_' num2str(i-1)]; 
         end
    
          
    B=dir(fname3);  % vypíšou se jednotlivá data, co se nachází ve složce 
    delka =length(B)-2;
    
    for(j=3:length(A)) %první dvě nás nezajímají, proto od 3
        %do buňky se načtou všechny data za sebou  - obrazky i anotace
        images{index}= imresize(double(imread([fname2 '\' A(j).name]))/65536,1/3);
        labels{index}= imresize(imread([fname3 '\Label_' num2str(j-2) '.png']),1/3);
        labels{index}= labels{index}>1; %ceva = 1, pozadí =0
        
        max_odezva{index}=filtrace(images{index},maska0,maska15,maska30,maska45,maska60,maska75,maska90,maska105,maska120,maska135,maska150,maska165); %konvoluce obrazu s jednotlivými maskami a zisk maximální odezvy
        max_odezva2{index}=filtrace(images{index},maska_st0,maska_st15,maska_st30,maska_st45,maska_st60,maska_st75,maska_st90,maska_st105,maska_st120,maska_st135,maska_st150,maska_st165);
        max_odezva3{index}=filtrace(images{index},maska_t0,maska_t15,maska_t30,maska_t45,maska_t60,maska_t75,maska_t90,maska_t105,maska_t120,maska_t135,maska_t150,maska_t165);

    E{index} = entropyfilt(images{index}); %lokální entropie
    S{index} = stdfilt(images{index},ones(9)); %lokální směrodatná odchylka
    R{index} = rangefilt(images{index},ones(9)); %lokální rozsah
    num=num+numel(E{index}/3);%počet prvku v poli numel
    
    
        index=index+1;
    end
    
   
end


numsamples=2e6; %2 miliony vzorku, přičemž chceme milion cev a milion "pozadi", aby se to nenaučilo více na pozadí 
priznaky=zeros(numsamples,7); %podle příznaků -> mám 7 příznaků - E,S,R,odezva pro tluste, stredni a tenke cevy a obrazek jako takový
anotace=zeros(numsamples,2); %2 =>anotace bud ceva nebo pozadi 

ind=1;

numbg = 0; %pozadí
numfw = 0; %ceva
konec=130;
for(k=[1 : konec]) %procházím všechny obrázky postupně
    
      if(ind>numsamples)
            break;
      end
        
    for(i=1:size(E{k},1)) %Procházím celý snímek
        
        if(ind>numsamples)
            break;
        end
        
        for(j=1:size(E{k},2))
            
              if(ind>numsamples)
            break;
              end
        
                 if(labels{k}(i,j)==1 && numfw<numsamples/2) % pokud je to ceva a zároveň nemám tolik cév tolik kolik chci, tak pridam pixel do příznaku
            
                     priznaky(ind,7)=(E{k}(i,j,:)); %%priznaky z E,S,R
                     priznaky(ind,6)=(S{k}(i,j,:));
                     priznaky(ind,3)=(R{k}(i,j,:));
                     priznaky(ind,2)=(images{k}(i,j,:)); 
%             
                     priznaky(ind,1)=(max_odezva{k}(i,j,:)); 
                     priznaky(ind,5)=(max_odezva2{k}(i,j,:)); 
                     priznaky(ind,4)=(max_odezva3{k}(i,j,:)); 
            
           
                    anotace(ind,2)=labels{k}(i,j);
                    anotace(ind,1)=~labels{k}(i,j);
                                
                    ind=ind+1;
                    numfw=numfw+1;%ceva
            
            else if (labels{k}(i,j)==0 && numbg<numfw*2 && numbg<numsamples/2) %pokud to není ceva a pozadí mám mene než dvojnasobek cev než co mám, přidám pozadí
                     priznaky(ind,7)=(E{k}(i,j,:)); %%príznaky z E,S,R
                     priznaky(ind,6)=(S{k}(i,j,:));
                     priznaky(ind,3)=(R{k}(i,j,:));
                     priznaky(ind,2)=(images{k}(i,j,:)); 
%             
                     priznaky(ind,1)=(max_odezva{k}(i,j,:)); 
                     priznaky(ind,5)=(max_odezva2{k}(i,j,:)); 
                     priznaky(ind,4)=(max_odezva3{k}(i,j,:)); 
%             
           
                     anotace(ind,2)=labels{k}(i,j);
                     anotace(ind,1)=~labels{k}(i,j);
                   
                     ind=ind+1;
                     numbg=numbg+1; %přidám pozadí
                elseif(labels{k}(i,j)==0 && numbg<numsamples/2)  %není ceva, a nemám celý pozadí, tak doplním 
                     priznaky(ind,7)=(E{k}(i,j,:)); %%praznaky z E,S,R
                     priznaky(ind,6)=(S{k}(i,j,:));
                     priznaky(ind,3)=(R{k}(i,j,:));
                     priznaky(ind,2)=(images{k}(i,j,:)); 
%             
                     priznaky(ind,1)=(max_odezva{k}(i,j,:)); 
                     priznaky(ind,5)=(max_odezva2{k}(i,j,:)); 
                     priznaky(ind,4)=(max_odezva3{k}(i,j,:)); 
%             
           
                     anotace(ind,2)=labels{k}(i,j);
                     anotace(ind,1)=~labels{k}(i,j);
                     
                     ind=ind+1;
                     numbg=numbg+1;
            
                end
            end
         end
    end
        
end

%% MRMR
% [idx,scores] = fscmrmr(priznaky,anotace(:,2));
% bar(scores(idx))
% xlabel('pořadí')
% ylabel('skóre')
% xticklabels({'Max odezva','Rangefilt','Obraz - jas','Max odezva3','Max odezva2','Entropyfilt','Stdfilt'})
% xtickangle(45)
% poradi = idx(1:7)
%% trenovaní neuronky
sit=patternnet([7 5]); %vrstvy v neuronce

%trainFcn = 'trainscg';  % Scaled conjugate gradient backpropagation.
[sit,tr]=train(sit,priznaky',anotace','useParallel','yes','showResources','yes');
save('vse1','sit')

