clear all; close all; clc

D = 1; % vzdialenosť medzi pixelmi v co-oc matici
NumLevels = 256;

r = 30; % veľkosť vzoriek
h_o = 50; % poloha horného okraja vzoriek

h_r = 20; % horizontálny rozostup vzoriek
v_r = 20; % vertikálny rozostup vzoriek

h_p = 8; % počet vzoriek horizontálne
v_p = 1; % počet vzoriek vertikálne
n_v = h_p*v_p; % počet vzoriek v jednom obr.

datab_testy = cell(4,1);
%% načítanie sád obrazov
% load('databaza_obr_oct_agaroza_gel_log_10.mat');
% load('databaza_obr_oct_agaroza_gel_surove.mat')

% load('databaza_obr_oct_intralipid_gel_log10_bez_priemeru.mat')
% load('databaza_obr_oct_intralipid_gel_log10_priemer.mat');
% load('databaza_obr_oct_intralipid_gel_surove_bez_priemeru.mat')
load('databaza_obr_oct_intralipid_gel_surove_priemer.mat')

% load('databaza_obr_oct_intralipid_voda_log10_bez_priemeru.mat')
% load('databaza_obr_oct_intralipid_voda_log10_priemer.mat')
% load('databaza_obr_oct_intralipid_voda_surove_bez_priemeru.mat')
% load('databaza_obr_oct_intralipid_voda_surove_priemer.mat')

%% vytvorenie vzoriek


% veľkosť databázy
sd = size(data);

% prazdne b. pole pre vyber 4 vyrezov z kazdeho obr. v definovanej hlbke
dVzoriek = cell(2*sd(1),sd(2)); 
% zrozumiteľnejšie: dVzoriek = cell(4*0.5*sd(1),2)
% 4 výrezy z každého obrazu
% 0,5 - polovica obrazov je použitá pre vytvorenie databázy testov

% cyklus pre výber stĺpca databázy (každý stĺpec iný gél)
for i = 1:sd(2);

    % cyklus pre výber riadku databázy (číslo obr. v stĺpci)
    for j = (sd(1)/2)+1:sd(1); % druhá polovica databázy pre testy
                                   % v skripte pre triedy je prvá polovica: 
                                   % j = 1:sd(1)/2;

        obr = data{j,i}; % výber obrázku z databázy
%         if normalizacia == 1
%             obr = obr - min(min(obr));  
%             obr = obr/max(max(obr));
%         end
%         obr = round(obr*255);
%         obr = obr - min(min(obr));  
%         obr = obr/max(max(obr));
%         figure
%         imhist(obr);
%         num1 = unique(obr);
%         obr = histeq(obr,256);
%         figure
%         imhist(obr);
%         num2 = unique(obr);
%          % podvzorkovanie - spriemerovanie obr.
%          velkost podvzorkovaneho obrazku
%          so = size(obr)/2;
%          % novy spriemerovany obraz
%          n_obr = zeros(so);
% 
%          for k = 1:so(1,1)
%              e = 2*k;
%              for l = 1:so(1,2)
%                  f = 2*l;
%                  n_obr(k,l) = (obr(e,f)+...
%                               obr(e-1,f)+...
%                               obr(e,f-1)+...
%                               obr(e-1,f-1))/4;
%             end
%         end
%         obr = n_obr; % podvzorkovany obraz s rozmermi 256 x 256

        riadok = 1; % počítadlo pre ukladanie na konkrétnej pozícii

        % m*n = počet vzoriek z jedného obrazu
        for m = 1:h_p; % horizontalny posun
            for n = 1:v_p % vertikalny posun
            A = h_o + (n-1)*(r + v_r);
            B = (((m-1)*(r + h_r))+1);
            vzorka = obr(A : A + r-1, B : B + r-1); 

            dVzoriek{(j-sd(1)/2-1)*n_v+riadok,i} = vzorka;
            riadok = riadok+1;
            end
        end
    end
end

sV = size(dVzoriek);

%% výpočet vektrou čŕt databázy tried - prvých 20 parametrov
for n = 1:sV(2) % stĺpec po stĺpci pre každý gél
    k = 1;
    c = cell(sV(1), 4); % prázdne bunkové polo pre uloženie co-oc matíc
    for o = 1:sV(1)
        % 4 co-oc matice pre 4 rôzne smery
        c{k,1} = graycomatrix(dVzoriek{o,n},'NumLevels',NumLevels,'Offset', [0 D], 'G', []);
        c{k,2} = graycomatrix(dVzoriek{o,n},'NumLevels',NumLevels,'Offset', [-D D], 'G', []);
        c{k,3} = graycomatrix(dVzoriek{o,n},'NumLevels',NumLevels,'Offset', [-D 0], 'G', []);
        c{k,4} = graycomatrix(dVzoriek{o,n},'NumLevels',NumLevels,'Offset', [-D -D], 'G', []);
        k=k+1;
    end
    d = zeros(sV(1),24); % prázdna matica pre uloženie vektoru čŕt pre všetky gély

    for p = 1:sV(1)
        for q = 1:4 % postupne pre 4 smery
            stats = graycoprops(c{p,q}, {'Energy', 'Correlation', 'Homogeneity', 'Contrast'});
            stats = struct2cell(stats); % prevod struct na cell array
            stats = cell2mat(stats); % prevod cell array na maticu
            stats = stats.';
            ent = entropy(c{p,q});
            d(p,1+(q-1)*5:4+(q-1)*5) = stats;
            d(p,5+(q-1)*5) = ent;
        end
    end
    
%     %% výpočet výkonového spektra 4 frekv. pásem - zvyšné 4 parametre
    for o = 1:sV(1)
    s = fft2(dVzoriek{o,n}); % spektrum
%     imshow(spektrum);
    ss = size(s);
    s = abs(fftshift(s));
    ps = s.^2; %(výkonové spektrum)
    osm = floor(r/8); % osmina veľkosti vzorky
    stred = ss(1)/2;

    s1 = sum(sum(ps(stred+1-osm:stred+osm, stred+1-osm:stred+osm)));
    s2 = sum(sum(ps(stred+1-osm*2:stred+osm*2, stred+1-osm*2:stred+osm*2)));
    s3 = sum(sum(ps(stred+1-osm*3:stred+osm*3, stred+1-osm*3:stred+osm*3)));
    s4 = sum(sum(ps));

    % výkonové spektrum vo frekvenčných pásmach p1 - p4
    p1 = s1;
    p2 = s2 - s1;
    p3 = s3 - s2;
    p4 = s4 - s3;

    param = zeros(1,4);
    param(1,1) = p1/s4*100;%*0.0625; % zakomentovaná pomerná veľkosť plochy z celkového výkonového spektra
    param(1,2) = p2/s4*100;%*0.1875;
    param(1,3) = p3/s4*100;%*0.3125;
    param(1,4) = p4/s4*100;%*0.4375;
    
    d(o,21:24) = param;
%     sucet = perc1+perc2+perc3+perc4;

%     imshow(log(spektrum),[]);% zobrazenie amplitudoveho spektra
%     break
    end
    
    datab_testy{n,:} = d;
end

%% uloženie vzoriek

% save('databaza_testov_co_oc_agaroza_gel_log_10.mat','datab_testy')
% save('databaza_testov_co_oc_agaroza_gel_surove.mat','datab_testy')

% save('databaza_testov_co_oc_intralipid_gel_log10_bez_priemeru.mat','datab_testy')
% save('databaza_testov_co_oc_intralipid_gel_log10_priemer.mat','datab_testy')
% save('databaza_testov_co_oc_intralipid_gel_surove_bez_priemeru.mat','datab_testy')
save('databaza_testov_co_oc_intralipid_gel_surove_priemer.mat','datab_testy')

% save('databaza_testov_co_oc_intralipid_voda_log10_bez_priemeru.mat','datab_testy')
% save('databaza_testov_co_oc_intralipid_voda_log10_priemer.mat','datab_testy')
% save('databaza_testov_co_oc_intralipid_voda_surove_bez_priemeru.mat','datab_testy')
% save('databaza_testov_co_oc_intralipid_voda_surove_priemer.mat','datab_testy')
