
%% Naètení vstupních dat
%clear all; close all; clc;
%AVIRIS
data_raw = 'Documents\MATLAB\aviris_data\f180130t01p00r24rdn_e_sc01_ort_img';
[data,i,j,k,metadata,vlnovadelka,idx_red,idx_green,idx_blue,idx_nir]=load_aviris(data_raw);

%%
%Testovací univerzitní data http://www.ehu.eus/ccwintco/index.php/Hyperspectral_Remote_Sensing_Scenes
clear all; close all; clc;
load('KSC.mat'); %Kennedy Space Center (KSC)
data=KSC; clear KSC;

% load('Indian_pines_corrected.mat'); %Indian Pines
% data=Indian_pines_corrected; clear Indian_pines_corrected;
% 
% load('Salinas_corrected.mat') %Salinas
% data=Salinas_corrected; clear Salinas_corrected;

idx_red=38;idx_green=20;idx_blue=8;idx_nir=48;
[i,j,k]=size(data);

%%
%LANDSAT 8
clear all; close all; clc;
[data,i,j,k,idx_red,idx_green,idx_blue,idx_nir]=load_landsat8();

%%
%HYPERION
clear all; close all; clc;
[data,i,j,k,idx_red,idx_green,idx_blue,idx_nir]=load_hyperion();

%%
%SENTINEL 2
clear all; close all; clc;
[data,i,j,k,idx_red,idx_green,idx_blue,idx_nir]=load_sentinel2();


%% Redukce dat - oøez snímku
close all

data_cropped=hypersp_orez(data);

% Základní analýza dat a vykreslení vybrané oblasti

[i,j,k]=size(data_cropped);
% min_hodnota_cropped=min_hodnota(data_cropped);
% max_hodnota_cropped=max_hodnota(data_cropped);

%  data_cropped=ekvalizace(data_cropped,min_hodnota_cropped);
% data_cropped=adpt_ekv(data_cropped);

% Uvolnìní pamìti
clear max_hodnota_cropped; clear min_hodnota_cropped; 
%clear data;

%% Uložení oøezaných dat
%save('Documents\MATLAB\aviris_cropped.mat','aviris_cropped'); %MAT soubor
%dlmwrite('Documents\MATLAB\aviris_cropped.txt',aviris_cropped); %TXT soubor
save('ent_no_water.mat','data_cropped','-v7.3'); %uložení vyšší verzí, vhodnìjší


%% Uložení dat - tif - CUBE
%  load('data_cropped_aviris_BIG_NAHLED.mat');
%  [i,j,k]=size(data_cropped);

tmp=zeros(i,j);
for kk=1:1:k
    tmp(:,:)=data_cropped(:,:,kk);
    tmp=mat2gray(tmp);
%     tmp(:,:)= adapthisteq(tmp(:,:),'clipLimit',0.08,'Distribution','rayleigh');
    tmp=tmp.^0.4;
    jmeno_souboru = strcat('aviris_band_no_water',num2str(kk),'.tif'); %jmeno grafu  
    imwrite(tmp,jmeno_souboru);
end

%% Uložení dat - jp2
tmp=zeros(i,j);
for kk=1:1:k
    tmp(:,:)=data_cropped(:,:,kk);
    tmp=mat2gray(tmp);
    jmeno_souboru = strcat('aviris_band_',num2str(kk),'.jp2'); %jmeno grafu  
    imwrite(tmp,jmeno_souboru);
end

%% Aviris - odstranìní nevhodných frekvenèních pásem
%pásma k odstranìní 0-8, 104, 107-117, 146, 152-170, 219, 221-224
[i,j,k]=size(data_cropped);

odstranit=[1,2,3,4,5,6,7,104,107,108,109,110,111,112,113,114,115,116,117,146,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,219,221,222,223,224];
len=length(odstranit);
index=1;

for kk=k:-1:1
    for index = 1:1:len
        
        if odstranit(1,index) == kk
           data_cropped(:,:,kk)=[];
        end
    end
end
    
    
    clear odstranit; clear l; clear index;

%% Vykreslení specifických vlnových délek

red_wavelength = 700;
green_wavelength = 546.1;
blue_wavelength = 435.8;
nir_wavelength = 800;

%idx_red=38;idx_green=20;idx_blue=8;
idx_red=36;idx_green=20;idx_blue=10;idx_nir=80;
%g=15-22 b=10-15 r=27-43

data_cropped_r = data_cropped(:,:,idx_red);
data_cropped_g = data_cropped(:,:,idx_green);
data_cropped_b = data_cropped(:,:,idx_blue);
data_cropped_nir = data_cropped(:,:,idx_nir);

%výpoèet NDVI
ndvi=(data_cropped_nir-data_cropped_r)./(data_cropped_nir+data_cropped_r);

figure1=figure; imagesc(ndvi);
colormap(jet), colorbar; 

xlabel('Vertikální souøadnice i [px]'); ylabel('Horizontální souøadnice j [px]'); % popis os
title('Index vegetace NDVI');
daspect([1 1 1]);
ax = gca; ax.FontSize = 18; % zvìtšení písma
set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu 
saveas(figure1,'NDVI.tif'); %export do tif



%vykreslení RGB
RGB_img=zeros(size(data_cropped));
RGB_img=combine_rgb(data_cropped(:,:,idx_red), data_cropped(:,:,idx_green), data_cropped(:,:,idx_blue));
figure4=figure; imshow(RGB_img,[]);
title('RGB náhled zvoleného oøezu');
%saveas(figure5,'figure5.bmp')

 while 1 %%zvýšení jasu
    prompt = 'Zvýšit jas? (0.0-1.0); 1=ponechat; 0=maximální jas ';
    jas = input(prompt);
    if jas >= 0 && jas <= 1
    break;
    end
    disp('Neplatný vstup, opakujte vložení, prosím.')
 end

figure5=figure; imagesc(RGB_img.^jas);
axis image; title('RGB náhled, zvýšený jas ');

%vykreslení a uložení grafù
figure6=figure; 
subplot(2,2,1);imshow(data_cropped_r.^jas,[]);
colormap(gray), colorbar; hold on; 
title(['Øez ', num2str(red_wavelength), ' [nm] (èervená)']);

subplot(2,2,2); imshow(data_cropped_g.^jas,[]);
colormap(gray), colorbar; hold on;
title(['Øez ', num2str(green_wavelength), ' [nm] (zelená)']);

subplot(2,2,3); imshow(data_cropped_b.^jas,[]);
colormap(gray), colorbar; hold on;
title(['Øez ', num2str(blue_wavelength), ' [nm] (modrá)']);

subplot(2,2,4); imshow(data_cropped_nir.^jas,[]);
colormap(gray), colorbar; 
title(['Øez ', num2str(nir_wavelength), ' [nm] (NIR)']);
%saveas(figure3,'figure3.bmp')

%% RGB - SWIR, VNIR

RGB_VNIR=zeros(i,j,3);
RGB_VNIR=combine_rgb(data_cropped(:,:,29), data_cropped(:,:,23), data_cropped(:,:,16));

RGB_Vegetation=zeros(i,j,3);
RGB_Vegetation=combine_rgb(data_cropped(:,:,53), data_cropped(:,:,23), data_cropped(:,:,16));

RGB_SWIR=zeros(i,j,3);
RGB_SWIR=combine_rgb(data_cropped(:,:,194), data_cropped(:,:,137), data_cropped(:,:,76));

for dim2=1:1:3
    RGB_VNIR(:,:,dim2)= adapthisteq(RGB_VNIR(:,:,dim2),'clipLimit',0.05,'Distribution','rayleigh');
    RGB_Vegetation(:,:,dim2)= adapthisteq(RGB_Vegetation(:,:,dim2),'clipLimit',0.05,'Distribution','rayleigh');
    RGB_SWIR(:,:,dim2)= adapthisteq(RGB_SWIR(:,:,dim2),'clipLimit',0.05,'Distribution','rayleigh');
end
clear dim;

figure7=figure;
subplot(1,3,1); imshow(RGB_VNIR.^0.7,[]);
title(['VNIR RGB 638:580:511 [nm]']);
subplot(1,3,2); imshow(RGB_Vegetation.^0.7,[]);
title(['VNIR Vegetace 850:580:511 [nm]']);
subplot(1,3,3); imshow(RGB_SWIR.^0.7,[]);
title(['SWIR RGB 2197:1651:1072 [nm]']);
set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu    
suptitle('False-color RGB náhledy dat Aviris')
saveas(figure7,'false-color_RGB.tif'); %export do tif

%% Spektra

%puvodni
vlnovadelka=xlsread('Documents\MATLAB\aviris_data\wavelengths.xlsx','B1:B224');
%redukce spektralni dimenze
% vlnovadelka=xlsread('Documents\MATLAB\aviris_data\wavelengths.xlsx','F1:F182');

figure8=figure;
imshow(RGB_VNIR.^0.7,[]);
title(['VNIR RGB 638:580:511 [nm]']);
set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu   

% [xi1,yi1] = getpts();
xi1=99;yi1=131;
xi1=round(xi1);yi1=round(yi1);

% [xi2,yi2] = getpts();
xi2=224;yi2=1237;
xi2=round(xi2);yi2=round(yi2);

% [xi3,yi3] = getpts();
xi3=217;yi3=2767;
xi3=round(xi3);yi3=round(yi3);

%výbìr spektra pixelu
data_cropped_sq_1 = squeeze(data_cropped(yi1, xi1,:));
data_cropped_sq_2 = squeeze(data_cropped(yi2, xi2,:));
data_cropped_sq_3 = squeeze(data_cropped(yi3, xi3,:));

%normování
data_cropped_sq_1 = data_cropped_sq_1/max(data_cropped_sq_1(:));
data_cropped_sq_2 = data_cropped_sq_2/max(data_cropped_sq_2(:));
data_cropped_sq_3 = data_cropped_sq_3/max(data_cropped_sq_3(:));

figure41=figure;

subplot(3,1,1);plot(vlnovadelka, data_cropped_sq_1,'Linewidth',2);
title(['Pixel P1 [xi,yi] = [', num2str(xi1), ',' num2str(yi1), ']']);
xlabel('Vlnová délka [nm]');
ylabel('Reflektance [-]'); 
xlim([350 2500]);
ax = gca; ax.FontSize = 12; % zvìtšení písma

subplot(3,1,2);plot(vlnovadelka, data_cropped_sq_2,'Linewidth',2);
title(['Pixel P2 [xi,yi] = [', num2str(xi2), ',' num2str(yi2), ']']);
xlabel('Vlnová délka [nm]');
ylabel('Reflektance [-]'); 
xlim([350 2500]);
ax = gca; ax.FontSize = 12; % zvìtšení písma

subplot(3,1,3);plot(vlnovadelka, data_cropped_sq_3,'Linewidth',2);
title(['Pixel P3 [xi,yi] = [', num2str(xi3), ',' num2str(yi3), ']']);
xlabel('Vlnová délka [nm]');
ylabel('Reflektance [-]'); 
xlim([350 2500]);
ax = gca; ax.FontSize = 12; % zvìtšení písma

set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu    
suptitle('Normovaná spektrální reflektance zvolených pixelù - po redukci spektrální dimenze')

saveas(figure41,'reflektance.tif'); %export do tif

%% Pøidání a zobrazení šumu - kompatibilní RGB, multi i hyperspektrální

figure9=figure;
subplot(2,2,1);
imshow(RGB_img,[]); title('Pùvodní RGB');
hold on;

u=max_hodnota(RGB_img);

subplot(2,2,2);
RGB_noise_g = sum_gauss(RGB_img);

[MSE,RMSE,MSE_matice]=MSE_vypocet(RGB_img,RGB_noise_g);
[PSNR,hodnota]=PSNR_vypocet(RGB_img,RGB_noise_g,MSE);
imshow(RGB_noise_g); title(['Gausùv šum, PSNR = ', num2str(PSNR)]);

subplot(2,2,3);
RGB_noise_s = sum_saltpepper(RGB_img);
[MSE,RMSE,MSE_matice]=MSE_vypocet(RGB_img,RGB_noise_s);
PSNR=PSNR_vypocet(RGB_img,RGB_noise_s,MSE);
imshow(RGB_noise_s); title(['Sùl a pepø, PSNR = ', num2str(PSNR)]);

subplot(2,2,4);
RGB_noise_sp = sum_speckle(RGB_img);
[MSE,RMSE,MSE_matice]=MSE_vypocet(RGB_img,RGB_noise_sp);
PSNR=PSNR_vypocet(RGB_img,RGB_noise_sp,MSE);
imshow(RGB_noise_sp); title(['Speckle, PSNR = ', num2str(PSNR)]);

%%
%test - šum a psnr pro celý hyperspektrální obraz
 
data_cropped_noise=sum_gauss(data_cropped); %generování snímkù se šumem
[MSE,RMSE,MSE_matice]=MSE_vypocet(data_cropped,data_cropped_noise);
PSNR=PSNR_vypocet(data_cropped,data_cropped_noise,MSE);

figure10=figure;
subplot(2,2,1);
imshow(RGB_img,[]);
title('RGB náhled pùvodních dat');

subplot(2,2,2);
data_noise_RGB=combine_rgb(data_cropped_noise(:,:,idx_red),data_cropped_noise(:,:,idx_green),data_cropped_noise(:,:,idx_blue));
imshow(data_noise_RGB,[]);
title('RGB náhled zašumìných dat');

subplot(2,2,3);
data_MSE_RGB=combine_rgb(MSE_matice(:,:,idx_red),MSE_matice(:,:,idx_green),MSE_matice(:,:,idx_blue));
imshow(data_MSE_RGB,[]);
title('RGB náhled MSE matice');


%% 1D DWT spektrální dekorelace
%_____________________________________________________________________________________
%VZOR
% Typy vlnek 1 = Haar, 2 = Daubechies, 3 = Symlets 4 = Biorthogonal, 
%            5 = Reverse Biorthogonal, 6 = Coiflets, 7 = Fejer-Korovkin, 
%            
%_____________________________________________________________________________________
% [vystup,koeficienty_dekompozice]=dwt_komprese(vstup,typ_vlnky,uroven_dekompozice);
% [vystup]=dwt_dekomprese(vstup,typ_vlnky,uroven_dekompozice,koeficienty_komprese);

% Náhled - použité vlnky
index_fig=1;
for typ=1:1:7
            
            fig_dwt = strcat('figure', num2str(index_fig)); %jmeno grafu
            fig_dwt_jmeno = strcat(convertCharsToStrings(fig_dwt), '.tif'); %definování výstupního jména grafu
            fig_dwt=figure;
            string jmeno;
            if (typ == 1) %Haar
                wname = 'haar';
                jmeno = 'Haar';
            elseif (typ == 2) %Daubechies 
                wname = 'db3';
                jmeno = 'Daubechies 3';
            elseif (typ == 3) %Symlets
                wname = 'sym3';
                jmeno = 'Symlets 3';
            elseif (typ == 4) %Biorthogonal
                wname = 'bior3.5';
                jmeno = 'Biortogonál 3.5';
            elseif (typ == 5) %Reverse Biorthogonal
                wname = 'rbio3.5';
                jmeno = 'Reverzní biortogonál 3.5';
            elseif (typ == 6) %Coiflets
                wname = 'coif3';  
                jmeno = 'Coiflets 3';
            elseif (typ == 7) %Fejer-Korovkin filters
                wname = 'fk4'; 
                jmeno = 'Fejer-Korovkin 4'; 
            end
    
    [LoD,HiD,LoR,HiR] = wfilters(wname); 
    subplot(2,2,1)
    stem(LoD)
    title('Dekompozice - dolní propust')
    subplot(2,2,2)
    stem(HiD)
    title('Dekompozice - horní propust')
    subplot(2,2,3)
    stem(LoR)
    title('Rekonstrukce - dolní propust')
    subplot(2,2,4)
    stem(HiR)
    title('Rekonstrukce - horní propust')
    suptitle(['Ètyøi použité filtry pro vlnku typu – ',jmeno])

    
            index_fig=index_fig+1;
            saveas(fig_dwt,fig_dwt_jmeno); %export do tif
            
end
clear typ; clear LoD; clear HiD; clear LoR; clear HiR; clear index_fig; clear fig_dwt; clear jmeno; clear fig_dwt_jmeno;   
%% 
%_____________________________________________________________________________________
%Porovnávání
%_____________________________________________________________________________________

% |||||||||||||||||||typ vlnky||||||||||||||||||||||||||||||||
% uroven_dwt=2; %deaktivovat v pøípadì potøeby
index=1;
index_fig=1;
cas_1d_dwt=zeros(14,7);%napilnime vysledky - 2 radky pro každou úroveò, 1 sloupec pro každou vlnku

for uroven_dwt=1:1:7

    for typ_1d=1:1:7
        
        tic; %stopky
        [dwt_1d_comp]=dwt_1d_optim(data_cropped,typ_1d,uroven_dwt); %DWT
        time_c=toc;tic; %stopky
        [dwt_1d_decomp]=idwt_1d_optim(dwt_1d_comp,typ_1d,uroven_dwt); %IDWT
        time_d=toc; %stopky
        cas_1d_dwt(index,typ_1d)=time_c; %èas DWT => první (lichý) øádek matice
        cas_1d_dwt(index+1,typ_1d)=time_d; %èas IDWT => druhý (sudý) øádek matice 
    end
        fig_dwt = strcat('figure', num2str(index_fig)); %jmeno grafu
        index_fig=index_fig+1;
        
        fig_dwt_jmeno = strcat(convertCharsToStrings(fig_dwt), '.tif'); %definování výstupního jména grafu
        cat = categorical({'Haar','Daubechies','Symlets','Biorthogonal','Reverse Biorthogonal','Coiflets','Fejer-Korovkin'}); %osa x grafu
        cat = reordercats(cat,{'Haar','Daubechies','Symlets','Biorthogonal','Reverse Biorthogonal','Coiflets','Fejer-Korovkin'}); %bez tohoto øádku dojde k abecednímu seøazení

        tmp=zeros;tmp=cas_1d_dwt(index:index+1,:);tmp=tmp'; %výbìr dat a transpozice do sloupcù
        fig_dwt=figure;bar(cat,tmp,'stacked'); %parametry grafu
        title(['Porovnání doby prùbìhu 1D DWT a IDWT dat ', num2str(i),'x', num2str(j),'x',num2str(k),' [px], dekompozice ',num2str(uroven_dwt),'. úrovnì']);
        xlabel('Typ použité vlnky'); ylabel('Èas [s]'); % popis os
        ax = gca; ax.FontSize = 14; % zvìtšení písma
        legend({'DWT','IDWT'},'Location','northeast') %legenda (komprese/dekomprese)
        set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu  
        index=index+2; % indexace matice výsledkù
        saveas(fig_dwt,fig_dwt_jmeno); %export do tif
end
    xlswrite('dwt_1d_aviris_cas_ur_1az7.xlsx',cas_1d_dwt) % export výsledkù do xml
    
    close all;
%%
%%_____________________________________________________________________________________
%RGB VYKRESLENÍ Pøed a Po
%_____________________________________________________________________________________
%

    [dwt_1D_comp_1]=dwt_1d_komprese(data_cropped,4,1); %DWT
    [dwt_1D_comp_2]=dwt_1d_komprese(data_cropped,4,2); %DWT
    [dwt_1D_comp_3]=dwt_1d_komprese(data_cropped,4,3); %DWT
    [dwt_1D_comp_4]=dwt_1d_komprese(data_cropped,4,4); %DWT
    [dwt_1D_comp_5]=dwt_1d_komprese(data_cropped,4,5); %DWT
    [dwt_1D_comp_6]=dwt_1d_komprese(data_cropped,4,6); %DWT
    [dwt_1D_comp_7]=dwt_1d_komprese(data_cropped,4,7); %DWT
    %%
    [dwt_1D_decomp]=idwt_1d_dekomprese(dwt_1D_comp_7,4,7); %IDWT
      %%         
        fig_dwt = strcat('figure', num2str(index_fig)); %jmeno grafu
        index_fig=index_fig+1;
        fig_dwt_jmeno = strcat(convertCharsToStrings(fig_dwt), '.tif'); %definování výstupního jména grafu
     
        RGB_dwt_1D_comp_1=combine_rgb(dwt_1D_comp_1(:,:,idx_red), dwt_1D_comp_1(:,:,idx_green), dwt_1D_comp_1(:,:,idx_blue));
        RGB_dwt_1D_comp_2=combine_rgb(dwt_1D_comp_2(:,:,idx_red), dwt_1D_comp_2(:,:,idx_green), dwt_1D_comp_2(:,:,idx_blue));
        RGB_dwt_1D_comp_3=combine_rgb(dwt_1D_comp_3(:,:,idx_red), dwt_1D_comp_3(:,:,idx_green), dwt_1D_comp_3(:,:,idx_blue));
        RGB_dwt_1D_comp_4=combine_rgb(dwt_1D_comp_4(:,:,idx_red), dwt_1D_comp_4(:,:,idx_green), dwt_1D_comp_4(:,:,idx_blue));
        RGB_dwt_1D_comp_5=combine_rgb(dwt_1D_comp_5(:,:,idx_red), dwt_1D_comp_5(:,:,idx_green), dwt_1D_comp_5(:,:,idx_blue));
        RGB_dwt_1D_comp_6=combine_rgb(dwt_1D_comp_6(:,:,idx_red), dwt_1D_comp_6(:,:,idx_green), dwt_1D_comp_6(:,:,idx_blue));
        RGB_dwt_1D_comp_7=combine_rgb(dwt_1D_comp_7(:,:,idx_red), dwt_1D_comp_7(:,:,idx_green), dwt_1D_comp_7(:,:,idx_blue));
        RGB_dwt_1D_decomp=combine_rgb(dwt_1D_decomp(:,:,idx_red), dwt_1D_decomp(:,:,idx_green), dwt_1D_decomp(:,:,idx_blue));

        
        fig_dwt=figure;
            subplot(3,3,1); imshow(RGB_img.^jas,[]); title('Pùvodní data');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,2); imshow(RGB_dwt_1D_comp_1.^jas,[]); title('1D DWT 1. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,3); imshow(RGB_dwt_1D_comp_2.^jas,[]); title('1D DWT 2. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,4); imshow(RGB_dwt_1D_comp_3.^jas,[]); title('1D DWT 3. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,5); imshow(RGB_dwt_1D_comp_4.^jas,[]); title('1D DWT 4. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,6); imshow(RGB_dwt_1D_comp_5.^jas,[]); title('1D DWT 5. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,7); imshow(RGB_dwt_1D_comp_6.^jas,[]); title('1D DWT 6. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,8); imshow(RGB_dwt_1D_comp_7.^jas,[]); title('1D DWT 7. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,9); imshow(RGB_dwt_1D_decomp.^jas,[]); title('1D IDWT'); 
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu 

        
    saveas(fig_dwt,fig_dwt_jmeno); %export do tif
    close all; hold off;
%%
% 2D DWT komprese

%volání komprese
% dwt_2D_comp=dwt_2d_komprese(data_cropped,2,1); %dwt_2d_komprese(vstup,typ,uroven)
%volání dekomprese
% dwt_2D_decomp=idwt_2d_dekomprese(dwt_2D_comp,2,1); %idwt_2d_dekomprese(vstup,typ,uroven)

index=1;

cas_2d_dwt=zeros(14,7);%napilnime vysledky - 2 radky pro každou úroveò, 1 sloupec pro každou vlnku

for uroven_dwt=1:1:7

    for typ_2d=1:1:7
        tic; %stopky
        dwt_2D_comp=dwt_2d_komprese(data_cropped,typ_2d,uroven_dwt); %DWT
        time_c=toc;tic; %stopky
        dwt_2D_decomp=idwt_2d_dekomprese(dwt_2D_comp,typ_2d,uroven_dwt); %IDWT
        time_d=toc; %stopky
        cas_2d_dwt(index,typ_2d)=time_c; %èas DWT => první (lichý) øádek matice
        cas_2d_dwt(index+1,typ_2d)=time_d; %èas IDWT => druhý (sudý) øádek matice 
    end
        fig_dwt = strcat('figure', num2str(index_fig)); %jmeno grafu
        index_fig=index_fig+1;
        fig_dwt_jmeno = strcat(convertCharsToStrings(fig_dwt), '.tif'); %definování výstupního jména grafu
        cat = categorical({'Haar','Daubechies','Symlets','Biorthogonal','Reverse Biorthogonal','Coiflets','Fejer-Korovkin'}); %osa x grafu
        cat = reordercats(cat,{'Haar','Daubechies','Symlets','Biorthogonal','Reverse Biorthogonal','Coiflets','Fejer-Korovkin'}); %bez tohoto øádku dojde k abecednímu seøazení
        tmp=zeros;tmp=cas_2d_dwt(index:index+1,:);tmp=tmp'; %výbìr dat a transpozice do sloupcù
        fig_dwt=figure;bar(cat,tmp,'stacked'); %parametry grafu
        title(['Porovnání doby prùbìhu 2D DWT a IDWT dat ', num2str(i),'x', num2str(j),'x',num2str(k),' [px], dekompozice ',num2str(uroven_dwt),'. úrovnì']);
        xlabel('Typ použité vlnky'); ylabel('Èas [s]'); % popis os
        ax = gca; ax.FontSize = 14; % zvìtšení písma
        legend({'DWT','IDWT'},'Location','northeast') %legenda (komprese/dekomprese)
        set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu  
        index=index+2; % indexace matice výsledkù
        saveas(fig_dwt,fig_dwt_jmeno); %export do tif
end
    xlswrite('dwt_2d_aviris_cas_ur_1az7.xlsx',cas_2d_dwt) % export výsledkù do xml
    close all;

%%
%vytváøení RGB náhledù

%%_____________________________________________________________________________________
%RGB VYKRESLENÍ Pøed a Po
%_____________________________________________________________________________________


    [dwt_2D_comp_1]=dwt_2d_komprese(data_cropped,4,1); %DWT
    [dwt_2D_comp_2]=dwt_2d_komprese(data_cropped,4,2); %DWT
    [dwt_2D_comp_3]=dwt_2d_komprese(data_cropped,4,3); %DWT
    [dwt_2D_comp_4]=dwt_2d_komprese(data_cropped,4,4); %DWT
    [dwt_2D_comp_5]=dwt_2d_komprese(data_cropped,4,5); %DWT
    [dwt_2D_comp_6]=dwt_2d_komprese(data_cropped,4,6); %DWT
    [dwt_2D_comp_7]=dwt_2d_komprese(data_cropped,4,7); %DWT
    
    [dwt_2D_decomp]=idwt_2d_dekomprese(dwt_2D_comp_7,4,7); %IDWT
       %%        
        fig_dwt = strcat('figure', num2str(index_fig)); %jmeno grafu
        index_fig=index_fig+1;
        fig_dwt_jmeno = strcat(convertCharsToStrings(fig_dwt), '.tif'); %definování výstupního jména grafu
     
        RGB_dwt_2D_comp_1=combine_rgb(dwt_2D_comp_1(:,:,idx_red), dwt_2D_comp_1(:,:,idx_green), dwt_2D_comp_1(:,:,idx_blue));
        RGB_dwt_2D_comp_2=combine_rgb(dwt_2D_comp_2(:,:,idx_red), dwt_2D_comp_2(:,:,idx_green), dwt_2D_comp_2(:,:,idx_blue));
        RGB_dwt_2D_comp_3=combine_rgb(dwt_2D_comp_3(:,:,idx_red), dwt_2D_comp_3(:,:,idx_green), dwt_2D_comp_3(:,:,idx_blue));
        RGB_dwt_2D_comp_4=combine_rgb(dwt_2D_comp_4(:,:,idx_red), dwt_2D_comp_4(:,:,idx_green), dwt_2D_comp_4(:,:,idx_blue));
        RGB_dwt_2D_comp_5=combine_rgb(dwt_2D_comp_5(:,:,idx_red), dwt_2D_comp_5(:,:,idx_green), dwt_2D_comp_5(:,:,idx_blue));
        RGB_dwt_2D_comp_6=combine_rgb(dwt_2D_comp_6(:,:,idx_red), dwt_2D_comp_6(:,:,idx_green), dwt_2D_comp_6(:,:,idx_blue));
        RGB_dwt_2D_comp_7=combine_rgb(dwt_2D_comp_7(:,:,idx_red), dwt_2D_comp_7(:,:,idx_green), dwt_2D_comp_7(:,:,idx_blue));
        RGB_dwt_2D_decomp=combine_rgb(dwt_2D_decomp(:,:,idx_red), dwt_2D_decomp(:,:,idx_green), dwt_2D_decomp(:,:,idx_blue));

        
        fig_dwt=figure;
            subplot(3,3,1); imshow(RGB_img.^jas,[]); title('Pùvodní data');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,2); imshow(RGB_dwt_2D_comp_1.^jas,[]); title('2D DWT 1. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,3); imshow(RGB_dwt_2D_comp_2.^jas,[]); title('2D DWT 2. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,4); imshow(RGB_dwt_2D_comp_3.^jas,[]); title('2D DWT 3. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,5); imshow(RGB_dwt_2D_comp_4.^jas,[]); title('2D DWT 4. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,6); imshow(RGB_dwt_2D_comp_5.^jas,[]); title('2D DWT 5. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,7); imshow(RGB_dwt_2D_comp_6.^jas,[]); title('2D DWT 6. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,8); imshow(RGB_dwt_2D_comp_7.^jas,[]); title('2D DWT 7. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,9); imshow(RGB_dwt_2D_decomp.^jas,[]); title('2D IDWT'); 
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu 

        
    saveas(fig_dwt,fig_dwt_jmeno); %export do tif

    close all;
%%
% 3D DWT komprese

% dwt_3d_comp=dwt_3d_komprese(data_cropped,2,2); %dwt_3d_komprese(vstup,typ,uroven)
% dwt_3d_decomp=idwt_3d_dekomprese(dwt_3d_comp,2,2); %idwt_3d_dekomprese(vstup,typ,uroven)

index=1;
cas_3d_dwt=zeros(14,7);%napilnime vysledky - 2 radky pro každou úroveò, 1 sloupec pro každou vlnku

for uroven_dwt=1:1:7

    for typ_3d=1:1:7
        tic; %stopky
        dwt_3D_comp=dwt_3d_komprese(data_cropped,typ_3d,uroven_dwt); %DWT
        time_c=toc;tic; %stopky
        dwt_3D_decomp=idwt_3d_dekomprese(dwt_3D_comp,typ_3d,uroven_dwt); %IDWT
        time_d=toc; %stopky
        cas_3d_dwt(index,typ_3d)=time_c; %èas DWT => první (lichý) øádek matice
        cas_3d_dwt(index+1,typ_3d)=time_d; %èas IDWT => druhý (sudý) øádek matice 
    end
        fig_dwt = strcat('figure', num2str(index_fig)); %jmeno grafu
        index_fig=index_fig+1;
        
        fig_dwt_jmeno = strcat(convertCharsToStrings(fig_dwt), '.tif'); %definování výstupního jména grafu
        cat = categorical({'Haar','Daubechies','Symlets','Biorthogonal','Reverse Biorthogonal','Coiflets','Fejer-Korovkin'}); %osa x grafu
        cat = reordercats(cat,{'Haar','Daubechies','Symlets','Biorthogonal','Reverse Biorthogonal','Coiflets','Fejer-Korovkin'}); %bez tohoto øádku dojde k abecednímu seøazení
        tmp=zeros;tmp=cas_3d_dwt(index:index+1,:);tmp=tmp'; %výbìr dat a transpozice do sloupcù
        fig_dwt=figure;bar(cat,tmp,'stacked'); %parametry grafu
        title(['Porovnání doby prùbìhu 3D DWT a IDWT dat ', num2str(i),'x', num2str(j),'x',num2str(k),' [px], dekompozice ',num2str(uroven_dwt),'. úrovnì']);
        xlabel('Typ použité vlnky'); ylabel('Èas [s]'); % popis os
        ax = gca; ax.FontSize = 14; % zvìtšení písma
        legend({'DWT','IDWT'},'Location','northeast') %legenda (komprese/dekomprese)
        set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu  
        index=index+2; % indexace matice výsledkù
        saveas(fig_dwt,fig_dwt_jmeno); %export do tif
end
    xlswrite('dwt_3d_aviris_cas_ur_1az7.xlsx',cas_3d_dwt) % export výsledkù do xml

 

%vytváøení RGB náhledù
%%
%%_____________________________________________________________________________________
%RGB VYKRESLENÍ Pøed a Po
%_____________________________________________________________________________________


    [dwt_3D_comp_1]=dwt_3d_komprese(data_cropped,4,1); %DWT
    [dwt_3D_comp_2]=dwt_3d_komprese(data_cropped,4,2); %DWT
    [dwt_3D_comp_3]=dwt_3d_komprese(data_cropped,4,3); %DWT
    [dwt_3D_comp_4]=dwt_3d_komprese(data_cropped,4,4); %DWT
    [dwt_3D_comp_5]=dwt_3d_komprese(data_cropped,4,5); %DWT
    [dwt_3D_comp_6]=dwt_3d_komprese(data_cropped,4,6); %DWT
    [dwt_3D_comp_7]=dwt_3d_komprese(data_cropped,4,7); %DWT
    
    [dwt_3D_decomp]=idwt_3d_dekomprese(dwt_3D_comp_7,4,7); %IDWT
               %%
        fig_dwt = strcat('figure', num2str(index_fig)); %jmeno grafu
        index_fig=index_fig+1;
        fig_dwt_jmeno = strcat(convertCharsToStrings(fig_dwt), '.tif'); %definování výstupního jména grafu
     
        RGB_dwt_3D_comp_1=combine_rgb(dwt_3D_comp_1(:,:,idx_red), dwt_3D_comp_1(:,:,idx_green), dwt_3D_comp_1(:,:,idx_blue));
        RGB_dwt_3D_comp_2=combine_rgb(dwt_3D_comp_2(:,:,idx_red), dwt_3D_comp_2(:,:,idx_green), dwt_3D_comp_2(:,:,idx_blue));
        RGB_dwt_3D_comp_3=combine_rgb(dwt_3D_comp_3(:,:,idx_red), dwt_3D_comp_3(:,:,idx_green), dwt_3D_comp_3(:,:,idx_blue));
        RGB_dwt_3D_comp_4=combine_rgb(dwt_3D_comp_4(:,:,idx_red), dwt_3D_comp_4(:,:,idx_green), dwt_3D_comp_4(:,:,idx_blue));
        RGB_dwt_3D_comp_5=combine_rgb(dwt_3D_comp_5(:,:,idx_red), dwt_3D_comp_5(:,:,idx_green), dwt_3D_comp_5(:,:,idx_blue));
        RGB_dwt_3D_comp_6=combine_rgb(dwt_3D_comp_6(:,:,idx_red), dwt_3D_comp_6(:,:,idx_green), dwt_3D_comp_6(:,:,idx_blue));
        RGB_dwt_3D_comp_7=combine_rgb(dwt_3D_comp_7(:,:,idx_red), dwt_3D_comp_7(:,:,idx_green), dwt_3D_comp_7(:,:,idx_blue));
        RGB_dwt_3D_decomp=combine_rgb(dwt_3D_decomp(:,:,idx_red), dwt_3D_decomp(:,:,idx_green), dwt_3D_decomp(:,:,idx_blue));

        
        fig_dwt=figure;
            subplot(3,3,1); imshow(RGB_img.^jas,[]); title('Pùvodní data');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,2); imshow(RGB_dwt_3D_comp_1.^jas,[]); title('3D DWT 1. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,3); imshow(RGB_dwt_3D_comp_2.^jas,[]); title('3D DWT 2. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,4); imshow(RGB_dwt_3D_comp_3.^jas,[]); title('3D DWT 3. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,5); imshow(RGB_dwt_3D_comp_4.^jas,[]); title('3D DWT 4. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,6); imshow(RGB_dwt_3D_comp_5.^jas,[]); title('3D DWT 5. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,7); imshow(RGB_dwt_3D_comp_6.^jas,[]); title('3D DWT 6. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,8); imshow(RGB_dwt_3D_comp_7.^jas,[]); title('3D DWT 7. úroveò');
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,9); imshow(RGB_dwt_3D_decomp.^jas,[]); title('3D IDWT'); 
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu 

        
    saveas(fig_dwt,fig_dwt_jmeno); %export do tif

%% DWT - kompletní porovnání namìøených výsledkù

dwt_1d_vysledky=xlsread('D:\Program Files\MATLAB\R2018a\bin\DIP\mereni_doby_dwt_400x400_komplet.xlsx','I2:I15');
dwt_2d_vysledky=xlsread('D:\Program Files\MATLAB\R2018a\bin\DIP\mereni_doby_dwt_400x400_komplet.xlsx','I17:I30');
dwt_3d_vysledky=xlsread('D:\Program Files\MATLAB\R2018a\bin\DIP\mereni_doby_dwt_400x400_komplet.xlsx','I32:I45');

dwt_1d_vysledky=(reshape(dwt_1d_vysledky,[2,7]))';
dwt_2d_vysledky=(reshape(dwt_2d_vysledky,[2,7]))';
dwt_3d_vysledky=(reshape(dwt_3d_vysledky,[2,7]))';

    for index=1:1:3
        fig = strcat('figure_DWT_komplet_', num2str(index),'D'); %jmeno grafu
        fig_exp_jmeno = strcat(convertCharsToStrings(fig), '.tif'); %definování výstupního jména grafu
        if index == 1
            vysledky=dwt_1d_vysledky;
        elseif index == 2
            vysledky=dwt_2d_vysledky;
        elseif index == 3
            vysledky=dwt_3d_vysledky;
        end
        cat = categorical({'1.','2.','3.','4.','5.','6.','7.'}); %osa x grafu
        cat = reordercats(cat,{'1.','2.','3.','4.','5.','6.','7.'}); %bez tohoto øádku dojde k abecednímu seøazení
        fig=figure;bar(cat,vysledky,'stacked'); %parametry grafu
        title(['Porovnání doby prùbìhu ', num2str(index),'D DWT a IDWT, celková dekorelace dat ', num2str(i),'x', num2str(j),'x',num2str(k),' [px], rùzné úrovnì dekompozice.']);
        xlabel('Úroveò dekompozice [-]'); ylabel('Èas [s]'); % popis os
        ax = gca; ax.FontSize = 14; % zvìtšení písma
        ylim([0 1800])
        legend({'DWT','IDWT'},'Location','northwest') %legenda (komprese/dekomprese)
        set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu  
        saveas(fig,fig_exp_jmeno); %export do bpm
    end

        fig = strcat('figure_DWT_komplet'); %jmeno grafu
        fig_exp_jmeno = strcat(convertCharsToStrings(fig), '.tif'); %definování výstupního jména grafu
        vysledky=([(dwt_1d_vysledky)' (dwt_2d_vysledky)' (dwt_3d_vysledky)'])'
        cat = categorical({'1D, 1.','1D, 2.','1D, 3.','1D, 4.','1D, 5.','1D, 6.','1D, 7.','2D, 1.','2D, 2.','2D, 3.','2D, 4.','2D, 5.','2D, 6.','2D, 7.','3D, 1.','3D, 2.','3D, 3.','3D, 4.','3D, 5.','3D, 6.','3D, 7.'}); %osa x grafu
        cat = reordercats(cat,{'1D, 1.','1D, 2.','1D, 3.','1D, 4.','1D, 5.','1D, 6.','1D, 7.','2D, 1.','2D, 2.','2D, 3.','2D, 4.','2D, 5.','2D, 6.','2D, 7.','3D, 1.','3D, 2.','3D, 3.','3D, 4.','3D, 5.','3D, 6.','3D, 7.'}); %bez tohoto øádku dojde k abecednímu seøazení
        fig=figure;bar(cat,vysledky,'stacked'); %parametry grafu
        title(['Porovnání doby prùbìhu DWT a IDWT, celková dekorelace dat ', num2str(i),'x', num2str(j),'x',num2str(k),' [px]']);
        xlabel('Dimenze [-], úroveò dekompozice [-]'); ylabel('Èas [s]'); % popis os
        ax = gca; ax.FontSize = 14; % zvìtšení písma
        ylim([0 1800])
        legend({'DWT','IDWT'},'Location','northwest') %legenda (komprese/dekomprese)
        set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu  
        saveas(fig,fig_exp_jmeno); %export do bpm
%       close all;
    
%%
%PCA


% VZOR
% [pca_komp,pca_vektory,pca_prumer_mat]=pca_komprese(data_cropped,30); %èíselný vstup urèuje procento použitých vlastních vektorù ~ ovlivòuje kompresní pomìr
% [pca_dekomp]=pca_dekomprese(pca_komp,data_cropped,pca_vektory,pca_prumer_mat);
% 


tic;
    [comp1,pca_vek_100,pca_prum_100]=pca_2d_komprese(data_cropped,80); %PCA
    
    [comp2]=zig_zag(comp1);
    comp_final=rle_komprese(comp2);
    time_c=toc;tic;
    decomp1=rle_dekomprese(comp_final);
    
    [decomp2]=inv_zig_zag(decomp1,pca_comp_100);
    
    [decomp_final]=pca_2d_dekomprese(decomp2,data_cropped,pca_vek_100,pca_prum_100); %iPCA
    time_d=toc;
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,pca_decomp_100); PSNR100=PSNR_vypocet(data_cropped,pca_decomp_100,MSE);

    mereni_parametru=zeros(1,5);index=1;
    [MSE,RMSE,MSE_matice]=MSE_vypocet(data_cropped,decomp_final);
    [PSNR,maximum]=PSNR_vypocet(data_cropped,decomp_final,MSE);
    mereni_parametru(index,1)=time_c;
    mereni_parametru(index,2)=time_d;
    mereni_parametru(index,3)=objem_dat(data_cropped);
    mereni_parametru(index,4)=objem_dat(comp_final);
    mereni_parametru(index,5)=kompresni_pomer(data_cropped,comp_final);
    mereni_parametru(index,6)=MSE;
    mereni_parametru(index,7)=PSNR;
    
    %%
    [pca_comp_90,pca_vek_90,pca_prum_90]=pca_2d_komprese(data_cropped,90); %PCA
    [pca_decomp_90]=pca_2d_dekomprese(pca_comp_90,data_cropped,pca_vek_90,pca_prum_90); %iPCA
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,pca_decomp_90); PSNR90=PSNR_vypocet(data_cropped,pca_decomp_90,MSE);
    
    [pca_comp_80,pca_vek_80,pca_prum_80]=pca_2d_komprese(data_cropped,80); %PCA
    [pca_decomp_80]=pca_2d_dekomprese(pca_comp_80,data_cropped,pca_vek_80,pca_prum_80); %iPCA
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,pca_decomp_80); PSNR80=PSNR_vypocet(data_cropped,pca_decomp_80,MSE);
    
    [pca_comp_70,pca_vek_70,pca_prum_70]=pca_2d_komprese(data_cropped,70); %PCA
    [pca_decomp_70]=pca_2d_dekomprese(pca_comp_70,data_cropped,pca_vek_70,pca_prum_70); %iPCA
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,pca_decomp_70); PSNR70=PSNR_vypocet(data_cropped,pca_decomp_70,MSE);
   
    [pca_comp_60,pca_vek_60,pca_prum_60]=pca_2d_komprese(data_cropped,60); %PCA
    [pca_decomp_60]=pca_2d_dekomprese(pca_comp_60,data_cropped,pca_vek_60,pca_prum_60); %iPCA
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,pca_decomp_60); PSNR60=PSNR_vypocet(data_cropped,pca_decomp_60,MSE);
    
    [pca_comp_50,pca_vek_50,pca_prum_50]=pca_2d_komprese(data_cropped,50); %PCA
    [pca_decomp_50]=pca_2d_dekomprese(pca_comp_50,data_cropped,pca_vek_50,pca_prum_50); %iPCA
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,pca_decomp_50); PSNR50=PSNR_vypocet(data_cropped,pca_decomp_50,MSE);  
    
    [pca_comp_40,pca_vek_40,pca_prum_40]=pca_2d_komprese(data_cropped,40); %PCA
    [pca_decomp_40]=pca_2d_dekomprese(pca_comp_40,data_cropped,pca_vek_40,pca_prum_40); %iPCA
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,pca_decomp_40); PSNR40=PSNR_vypocet(data_cropped,pca_decomp_40,MSE); 
    
    [pca_comp_30,pca_vek_30,pca_prum_30]=pca_2d_komprese(data_cropped,30); %PCA
    [pca_decomp_30]=pca_2d_dekomprese(pca_comp_30,data_cropped,pca_vek_30,pca_prum_30); %iPCA
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,pca_decomp_30); PSNR30=PSNR_vypocet(data_cropped,pca_decomp_30,MSE); 
    
    [pca_comp_20,pca_vek_20,pca_prum_20]=pca_2d_komprese(data_cropped,20); %PCA
    [pca_decomp_20]=pca_2d_dekomprese(pca_comp_20,data_cropped,pca_vek_20,pca_prum_20); %iPCA
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,pca_decomp_20); PSNR20=PSNR_vypocet(data_cropped,pca_decomp_20,MSE);

     
RGB_pca_decomp_100=combine_rgb(pca_decomp_100(:,:,idx_red), pca_decomp_100(:,:,idx_green), pca_decomp_100(:,:,idx_blue));
RGB_pca_decomp_90=combine_rgb(pca_decomp_90(:,:,idx_red), pca_decomp_90(:,:,idx_green), pca_decomp_90(:,:,idx_blue));
RGB_pca_decomp_80=combine_rgb(pca_decomp_80(:,:,idx_red), pca_decomp_80(:,:,idx_green), pca_decomp_80(:,:,idx_blue));
RGB_pca_decomp_70=combine_rgb(pca_decomp_70(:,:,idx_red), pca_decomp_70(:,:,idx_green), pca_decomp_70(:,:,idx_blue));
RGB_pca_decomp_60=combine_rgb(pca_decomp_60(:,:,idx_red), pca_decomp_60(:,:,idx_green), pca_decomp_60(:,:,idx_blue));
RGB_pca_decomp_50=combine_rgb(pca_decomp_50(:,:,idx_red), pca_decomp_50(:,:,idx_green), pca_decomp_50(:,:,idx_blue));
RGB_pca_decomp_40=combine_rgb(pca_decomp_40(:,:,idx_red), pca_decomp_40(:,:,idx_green), pca_decomp_40(:,:,idx_blue));
RGB_pca_decomp_30=combine_rgb(pca_decomp_30(:,:,idx_red), pca_decomp_30(:,:,idx_green), pca_decomp_30(:,:,idx_blue));
RGB_pca_decomp_20=combine_rgb(pca_decomp_20(:,:,idx_red), pca_decomp_20(:,:,idx_green), pca_decomp_20(:,:,idx_blue));

        index_fig=1;       
        fig_dwt = strcat('figure', num2str(index_fig)); %jmeno grafu
        fig_dwt_jmeno = strcat(convertCharsToStrings(fig_dwt), '.tif'); %definování výstupního jména grafu

        
        fig_dwt=figure;
            subplot(3,3,1); imshow(RGB_pca_decomp_100.^jas,[]); title(['PCA 100%, PSNR = ', num2str(PSNR100),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,2); imshow(RGB_pca_decomp_90.^jas,[]); title(['PCA 90%, PSNR = ', num2str(PSNR90),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,3); imshow(RGB_pca_decomp_80.^jas,[]); title(['PCA 80%, PSNR = ', num2str(PSNR80),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,4); imshow(RGB_pca_decomp_70.^jas,[]); title(['PCA 70%, PSNR = ', num2str(PSNR70),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,5); imshow(RGB_pca_decomp_60.^jas,[]); title(['PCA 60%, PSNR = ', num2str(PSNR60),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,6); imshow(RGB_pca_decomp_50.^jas,[]); title(['PCA 50%, PSNR = ', num2str(PSNR50),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,7); imshow(RGB_pca_decomp_40.^jas,[]); title(['PCA 40%, PSNR = ', num2str(PSNR40),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,8); imshow(RGB_pca_decomp_30.^jas,[]); title(['PCA 30%, PSNR = ', num2str(PSNR30),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,9); imshow(RGB_pca_decomp_20.^jas,[]); title(['PCA 20%, PSNR = ', num2str(PSNR20),' [dB]']); 
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu 

        
    saveas(fig_dwt,fig_dwt_jmeno); %export do tif

%% DCT komprese
%vzor 
% dct_2d_comp= dct_komprese(data_cropped,95);
% dct_2d_decomp=dct_dekomprese(dct_2d_comp,95);


    [dct_comp_100]=dct_2d_komprese(data_cropped,100); %DCT
    [dct_decomp_100]=dct_2d_dekomprese(dct_comp_100,100); %iDCT
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,dct_decomp_100); PSNR100=PSNR_vypocet(data_cropped,dct_decomp_100,MSE);

    [dct_comp_90]=dct_2d_komprese(data_cropped,90); %DCT
    [dct_decomp_90]=dct_2d_dekomprese(dct_comp_90,90); %iDCT
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,dct_decomp_90); PSNR90=PSNR_vypocet(data_cropped,dct_decomp_90,MSE);
    
    [dct_comp_80]=dct_2d_komprese(data_cropped,80); %DCT
    [dct_decomp_80]=dct_2d_dekomprese(dct_comp_80,80); %iDCT
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,dct_decomp_80); PSNR80=PSNR_vypocet(data_cropped,dct_decomp_80,MSE);
    
    [dct_comp_70]=dct_2d_komprese(data_cropped,70); %DCT
    [dct_decomp_70]=dct_2d_dekomprese(dct_comp_70,70); %iDCT
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,dct_decomp_70); PSNR70=PSNR_vypocet(data_cropped,dct_decomp_70,MSE);
    
    [dct_comp_60]=dct_2d_komprese(data_cropped,60); %DCT
    [dct_decomp_60]=dct_2d_dekomprese(dct_comp_60,60); %iDCT
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,dct_decomp_60); PSNR60=PSNR_vypocet(data_cropped,dct_decomp_60,MSE);
    
    [dct_comp_50]=dct_2d_komprese(data_cropped,50); %DCT
    [dct_decomp_50]=dct_2d_dekomprese(dct_comp_50,50); %iDCT
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,dct_decomp_50); PSNR50=PSNR_vypocet(data_cropped,dct_decomp_50,MSE);
    
    [dct_comp_40]=dct_2d_komprese(data_cropped,40); %DCT
    [dct_decomp_40]=dct_2d_dekomprese(dct_comp_40,40); %iDCT
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,dct_decomp_40); PSNR40=PSNR_vypocet(data_cropped,dct_decomp_40,MSE);
    
    [dct_comp_30]=dct_2d_komprese(data_cropped,30); %DCT
    [dct_decomp_30]=dct_2d_dekomprese(dct_comp_30,30); %iDCT
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,dct_decomp_30); PSNR30=PSNR_vypocet(data_cropped,dct_decomp_30,MSE);
    
    [dct_comp_20]=dct_2d_komprese(data_cropped,20); %DCT
    [dct_decomp_20]=dct_2d_dekomprese(dct_comp_20,20); %iDCT
    [MSE,RMSE,MSE_mat]=MSE_vypocet(data_cropped,dct_decomp_20); PSNR20=PSNR_vypocet(data_cropped,dct_decomp_20,MSE);
     
RGB_dct_decomp_100=combine_rgb(dct_decomp_100(:,:,idx_red), dct_decomp_100(:,:,idx_green), dct_decomp_100(:,:,idx_blue));
RGB_dct_decomp_90=combine_rgb(dct_decomp_90(:,:,idx_red), dct_decomp_90(:,:,idx_green), dct_decomp_90(:,:,idx_blue));
RGB_dct_decomp_80=combine_rgb(dct_decomp_80(:,:,idx_red), dct_decomp_80(:,:,idx_green), dct_decomp_80(:,:,idx_blue));
RGB_dct_decomp_70=combine_rgb(dct_decomp_70(:,:,idx_red), dct_decomp_70(:,:,idx_green), dct_decomp_70(:,:,idx_blue));
RGB_dct_decomp_60=combine_rgb(dct_decomp_60(:,:,idx_red), dct_decomp_60(:,:,idx_green), dct_decomp_60(:,:,idx_blue));
RGB_dct_decomp_50=combine_rgb(dct_decomp_50(:,:,idx_red), dct_decomp_50(:,:,idx_green), dct_decomp_50(:,:,idx_blue));
RGB_dct_decomp_40=combine_rgb(dct_decomp_40(:,:,idx_red), dct_decomp_40(:,:,idx_green), dct_decomp_40(:,:,idx_blue));
RGB_dct_decomp_30=combine_rgb(dct_decomp_30(:,:,idx_red), dct_decomp_30(:,:,idx_green), dct_decomp_30(:,:,idx_blue));
RGB_dct_decomp_20=combine_rgb(dct_decomp_20(:,:,idx_red), dct_decomp_20(:,:,idx_green), dct_decomp_20(:,:,idx_blue));

        index_fig=1;       
        fig_dwt = strcat('figure', num2str(index_fig)); %jmeno grafu
        fig_dwt_jmeno = strcat(convertCharsToStrings(fig_dwt), '.tif'); %definování výstupního jména grafu

        
        fig_dwt=figure;
            subplot(3,3,1); imshow(RGB_dct_decomp_100.^jas,[]); title(['DCT 100%, PSNR = ', num2str(PSNR100),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,2); imshow(RGB_dct_decomp_90.^jas,[]); title(['DCT 90%, PSNR = ', num2str(PSNR90),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,3); imshow(RGB_dct_decomp_80.^jas,[]); title(['DCT 80%, PSNR = ', num2str(PSNR80),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,4); imshow(RGB_dct_decomp_70.^jas,[]); title(['DCT 70%, PSNR = ', num2str(PSNR70),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,5); imshow(RGB_dct_decomp_60.^jas,[]); title(['DCT 60%, PSNR = ', num2str(PSNR60),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,6); imshow(RGB_dct_decomp_50.^jas,[]); title(['DCT 50%, PSNR = ', num2str(PSNR50),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,7); imshow(RGB_dct_decomp_40.^jas,[]); title(['DCT 40%, PSNR = ', num2str(PSNR40),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,8); imshow(RGB_dct_decomp_30.^jas,[]); title(['DCT 30%, PSNR = ', num2str(PSNR30),' [dB]']);
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            
            subplot(3,3,9); imshow(RGB_dct_decomp_20.^jas,[]); title(['DCT 20%, PSNR = ', num2str(PSNR20),' [dB]']); 
            ax = gca; ax.FontSize = 14; % zvìtšení písma
            set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu 

        
    saveas(fig_dwt,fig_dwt_jmeno); %export do tif

%% KLT komprese


idx_red=36;idx_green=20;idx_blue=10;idx_nir=80;jas=0.4;

[klt_1d,vektor_mat,prumer_exp]=klt_1d_komprese(data_cropped);
[deklt_1d]=klt_1d_dekomprese(klt_1d,vektor_mat,prumer_exp);

[klt_2d,vl_vektor]=klt_2d_komprese(data_cropped);
[deklt_2d]=klt_2d_dekomprese(klt_2d,vl_vektor);    

    [MSE,RMSE,MSE_matice]=MSE_vypocet(data_cropped,deklt_1d);
    [PSNR1D,maximum]=PSNR_vypocet(data_cropped,deklt_1d,MSE);

    
    [MSE,RMSE,MSE_matice]=MSE_vypocet(data_cropped,deklt_2d);
    [PSNR2D,maximum]=PSNR_vypocet(data_cropped,deklt_2d,MSE);





RGB_raw=combine_rgb(data_cropped(:,:,idx_red), data_cropped(:,:,idx_green), data_cropped(:,:,idx_blue));
RGB_klt1d=combine_rgb(klt_1d(:,:,idx_red), klt_1d(:,:,idx_green), klt_1d(:,:,idx_blue));
RGB_deklt1d=combine_rgb(deklt_1d(:,:,idx_red), deklt_1d(:,:,idx_green), deklt_1d(:,:,idx_blue));

RGB_klt2d=combine_rgb(klt_2d(:,:,idx_red), klt_2d(:,:,idx_green), klt_2d(:,:,idx_blue));
RGB_deklt2d=combine_rgb(deklt_2d(:,:,idx_red), deklt_2d(:,:,idx_green), deklt_2d(:,:,idx_blue));

figure12=figure;
font=18
subplot(2,3,1);
imshow(RGB_raw.^jas,[]); title('Pùvodní data');
ax = gca; ax.FontSize = font; % zvìtšení písma

subplot(2,3,2);
imshow(RGB_klt1d.^jas,[]); title('Komprese KLT 1D');
ax = gca; ax.FontSize = font; % zvìtšení písma

subplot(2,3,3);
imshow(RGB_deklt1d.^jas,[]); title(['Rekonstrukce, PSNR = ',num2str(PSNR1D),' [dB]']);
ax = gca; ax.FontSize = font; % zvìtšení písma

subplot(2,3,4);
imshow(RGB_raw.^jas,[]); title('Pùvodní data');
ax = gca; ax.FontSize = font; % zvìtšení písma

subplot(2,3,5);
imshow(RGB_klt2d.^jas,[]); title('Komprese KLT 2D');
ax = gca; ax.FontSize = font; % zvìtšení písma

subplot(2,3,6);
imshow(RGB_deklt2d.^jas,[]); title(['Rekonstrukce, PSNR = ',num2str(PSNR2D),' [dB]']);
ax = gca; ax.FontSize = font; % zvìtšení písma
set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu 
saveas(figure12,'comparison_KLT.tif'); %export do tif

%% RLC komprese
%aviris_cropped_r_radek=matice_do_radku(aviris_cropped_r);
%rlc_test_rek=radek_do_matice(rlc_test,aviris_cropped_r);
%[MSE,RMSE,MSE_matice]=MSE_vypocet(aviris_cropped_r,rlc_test_rek);

%pozor na formát matice - øádcek/matice
rle=rle_komprese(data_cropped);

re_rle=rle_dekomprese(rle,data_cropped);

%porovnání pøed/po                   
%utvoøení RGB matice
RGB_img_rle_rek=zeros(size(re_rle));
RGB_img_rle_rek=combine_rgb(re_rle(:,:,idx_red), re_rle(:,:,idx_green), re_rle(:,:,idx_blue));

%výpoèet parametrù komprese
[MSE,RMSE,MSE_matice]=MSE_vypocet(RGB_img,RGB_img_rle_rek);
PSNR=PSNR_vypocet(RGB_img,RGB_img_rle_rek,MSE);
%KP=komp_pom(aviris_cropped,pca_komp);

%vykreslení dat
figure11=figure; 
subplot(1,2,1); imshow(RGB_img.^jas,[]); title('Pøed kompresí');
subplot(1,2,2); imshow(RGB_img_rle_rek.^jas,[]); title(['Po kompresi RLE, PSNR = ', num2str(PSNR)]);

%% Zig-Zag øazení dat
[rad_matice_zig]=zig_zag(data_cropped);
[matice_zig]=inv_zig_zag(rad_matice_zig,data_cropped);




%% Výpoèet entropie
[entropie_water]=entropie(water);
[entropie_no_water,matice]=entropie(no_water);
proc=(entropie_water-entropie_no_water)/(entropie_water/100);


%% Intra Band Correlation
%||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
%%Porovnání pøed a po odstranìní pásem vodní absorpce
% 1) naèíst datový set s vodou jako "water" a bez vody jako "no water"
%no_water=data_cropped;water=data_cropped; %clear data_cropped;
[water_cross]=norm_krizova_korelace3D(water);
[no_water_cross]=norm_krizova_korelace3D(no_water);



figure1=figure; font=11;
subplot(2,1,1);
I1=imagesc(water_cross);colormap('jet'); colorbar; title('Pøed odstranìním absorpèních pásem');
xlabel('Poøadí kanálu vlnové délky [-]'); ylabel('Poøadí kanálu vlnové délky [-]'); % popis os
ax = gca; ax.FontSize = font; % zvìtšení písma 
% set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu 
daspect([1 1 1]);%pomìr stran 1:1
I2=subplot(2,1,2);
imagesc(no_water_cross);colormap('jet'); colorbar; title('Po odstranìní absorpèních pásem');
xlabel('Poøadí kanálu vlnové délky [-]'); ylabel('Poøadí kanálu vlnové délky [-]'); % popis os
ax = gca; ax.FontSize = font; % zvìtšení písma 
suptitle('Normalizovaná spektrální køížová korelace');
ax = gca; % zvìtšení písma 
daspect([1 1 1]);%pomìr stran 1:1
set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu 
% linkaxes([I1,I2])
saveas(figure1,'before_after_cross.tif'); %export do tif

%clear water_cross; clear no_water_cross;

%% Porovnání vlivu transformace

uroven=2;typ=1;VV=100;

[komp_dwt_1d]=dwt_1d_komprese(no_water,typ,uroven);
[dwt_1d_cross]=norm_krizova_korelace3D(komp_dwt_1d);
clear komp_dwt_1d;

[komp_dwt_2d]=dwt_2d_komprese(no_water,typ,uroven);
[dwt_2d_cross]=norm_krizova_korelace3D(komp_dwt_2d);
clear komp_dwt_2d;

[komp_dwt_3d]=dwt_3d_komprese(no_water,typ,uroven);
[dwt_3d_cross]=norm_krizova_korelace3D(komp_dwt_3d);
clear komp_dwt_3d;

[komp_pca2d,pca_vektory,pca_prumer_mat]=pca_2d_komprese(no_water,VV);
[pca_2d_cross]=norm_krizova_korelace3D(komp_pca2d); clear pca_vektory; clear pca_prumer_mat;
clear komp_pca2d;

[komp_klt2d,vl_vektor]=klt_2d_komprese(no_water);

[klt_2d_cross]=norm_krizova_korelace3D(komp_klt2d);
clear komp_klt2d;

[komp_klt1d,vektor_mat,prumer_exp]=klt_1d_komprese(no_water);
[klt_1d_cross]=norm_krizova_korelace3D(komp_klt1d); clear vektor_mat; clear prumer_exp;

[komp_klt_pca,pca_vektory,pca_prumer_mat]=pca_2d_komprese(komp_klt1d,VV);
[klt_and_pca2d_cross]=norm_krizova_korelace3D(komp_klt_pca); clear pca_vektory; clear pca_prumer_mat;
clear komp_klt_pca;

[kompklt_klt2d,vl_vektor]=klt_2d_komprese(komp_klt1d);
[klt_1d_and_2D_cross]=norm_krizova_korelace3D(kompklt_klt2d);  clear vl_vektor;
clear kompklt_klt2d;

[orig_cross]=norm_krizova_korelace3D(no_water);
%%
figure2=figure; 
font=12;
subplot(3,3,1);
imagesc(orig_cross);colormap('jet'); colorbar; title('Pùvodní data');
xlabel('Poøadí kanálu vlnové délky [-]'); ylabel('Poøadí kanálu vlnové délky [-]'); % popis os
daspect([1 1 1]); ax = gca; ax.FontSize = font; % zvìtšení písma % zvìtšení písma  %pomìr stran 1:1 %maximizace grafu 

subplot(3,3,2);
imagesc(pca_2d_cross);colormap('jet'); colorbar; title('PCA 2D');
xlabel('Poøadí kanálu vlnové délky [-]'); ylabel('Poøadí kanálu vlnové délky [-]'); % popis os
daspect([1 1 1]); ax = gca; ax.FontSize = font; % zvìtšení písma % zvìtšení písma  %pomìr stran 1:1 %maximizace grafu 

subplot(3,3,3);
imagesc(klt_and_pca2d_cross);colormap('jet'); colorbar; title('KLT 1D, PCA 2D');
xlabel('Poøadí kanálu vlnové délky [-]'); ylabel('Poøadí kanálu vlnové délky [-]'); % popis os
daspect([1 1 1]); ax = gca; ax.FontSize = font; % zvìtšení písma % zvìtšení písma  %pomìr stran 1:1 %maximizace grafu 

subplot(3,3,4);
imagesc(dwt_1d_cross);colormap('jet'); colorbar; title('DWT 1D');
xlabel('Poøadí kanálu vlnové délky [-]'); ylabel('Poøadí kanálu vlnové délky [-]'); % popis os
daspect([1 1 1]); ax = gca; ax.FontSize = font; % zvìtšení písma % zvìtšení písma  %pomìr stran 1:1 %maximizace grafu 

subplot(3,3,5);
imagesc(dwt_2d_cross);colormap('jet'); colorbar; title('DWT 2D');
xlabel('Poøadí kanálu vlnové délky [-]'); ylabel('Poøadí kanálu vlnové délky [-]'); % popis os
daspect([1 1 1]); ax = gca; ax.FontSize = font; % zvìtšení písma % zvìtšení písma  %pomìr stran 1:1 %maximizace grafu 

subplot(3,3,6);
imagesc(dwt_3d_cross);colormap('jet'); colorbar; title('DWT 3D');
xlabel('Poøadí kanálu vlnové délky [-]'); ylabel('Poøadí kanálu vlnové délky [-]'); % popis os
daspect([1 1 1]); ax = gca; ax.FontSize = font; % zvìtšení písma % zvìtšení písma  %pomìr stran 1:1 %maximizace grafu 

subplot(3,3,7);
imagesc(klt_1d_cross);colormap('jet'); colorbar; title('KLT 1D');
xlabel('Poøadí kanálu vlnové délky [-]'); ylabel('Poøadí kanálu vlnové délky [-]'); % popis os
daspect([1 1 1]); ax = gca; ax.FontSize = font; % zvìtšení písma % zvìtšení písma  %pomìr stran 1:1 %maximizace grafu 

subplot(3,3,8);
imagesc(klt_2d_cross);colormap('jet'); colorbar; title('KLT 2D');
xlabel('Poøadí kanálu vlnové délky [-]'); ylabel('Poøadí kanálu vlnové délky [-]'); % popis os
daspect([1 1 1]); ax = gca; ax.FontSize = font; % zvìtšení písma % zvìtšení písma  %pomìr stran 1:1 %maximizace grafu 

subplot(3,3,9);
imagesc(klt_1d_and_2D_cross);colormap('jet'); colorbar; title('KLT 1D, KLT 2D');
xlabel('Poøadí kanálu vlnové délky [-]'); ylabel('Poøadí kanálu vlnové délky [-]'); % popis os
daspect([1 1 1]); ax = gca; ax.FontSize = font; % zvìtšení písma % zvìtšení písma  %pomìr stran 1:1 %maximizace grafu 

suptitle('Normalizovaná spektrální køížová korelace po aplikaci kompresních metod');
ax = gca; ax.FontSize = font;
set(gcf, 'Position', get(0, 'Screensize')); %maximizace grafu 
saveas(figure2,'comparison_cross.tif'); %export do tif



%%
%__________________________________________________________________________
% Finální výsledky navržených algoritmù
%__________________________________________________________________________


%||||||||||||VZOR|||||||||||||||||
%mereni_parametru=zeros(10,7); %1) t komprese 2) t dekomprese 3) velikost pred 4) velikost po 5) komp. pomer 6) MSE 7) PSNR
%[MSE,RMSE,MSE_matice]=MSE_vypocet(puvodni,upraveny)
%[PSNR,maximum]=PSNR_vypocet(puvodni, upraveny, mse)
% [vystup]=dwt_1d_komprese(vstup,typ,uroven)
% [vystup]=idwt_1d_dekomprese(vstup,typ,uroven)
% 
% [vystup]=dwt_2d_komprese(vstup,typ,uroven)
% [vystup]=idwt_2d_dekomprese(vstup,typ,uroven)
% 
% [vystup]=dwt_3d_komprese(vstup,typ,uroven)
% [vystup]=idwt_3d_dekomprese(vstup,typ,uroven)
% 
% [vystup]=rle_komprese(vstup)
% [vystup]=rle_dekomprese(vstup)
% 
% [vystup,pca_vektory,pca_prumer_mat]=pca_2d_komprese(vstup,VV)
% [vystup]=pca_2d_dekomprese(pca_komp,orig,pca_vektory,pca_prumer_mat)
% 
% [vystup,center_val]=dct_2d_komprese(vstup,q)
% [vystup]=dct_2d_dekomprese(vstup,q,center_val)
% 
% [vystup,vektor_mat,prumer_exp]=klt_1d_komprese(vstup)
% [vystup]=klt_1d_dekomprese(vstup,vektor_mat,prumer_exp)
% 
% [vystup,vl_vektor]=klt_2d_komprese(vstup)
% [vystup]=klt_2d_dekomprese(vstup,puvodni,vl_vektor)
% 
% mereni_parametru=zeros(1,7); % definování matice, do níž budou vkládány namìøené hodnoty
% 
% for index=1:1:1
%     %____________________________________________
%     % Komprese a dekomprese
%     tic; % spuš�ìní "stopek"
%     
%     
%     time_c=toc;% zde konèí komprese
%     tic; % spuštìní "stopek"
%     
%     time_d=toc;% zde konèí dekomprese
%     %____________________________________________
%     % výpoèet parametrù
%     [MSE,RMSE,MSE_matice]=MSE_vypocet(data_cropped,decomp);
%     [PSNR,maximum]=PSNR_vypocet(data_cropped, decomp, MSE);
%     mereni_parametru(index,1)=time_c;
%     mereni_parametru(index,2)=time_d;
%     mereni_parametru(index,3)=objem_dat(data_cropped);
%     mereni_parametru(index,4)=objem_dat(decomp);
%     mereni_parametru(index,5)=kompresni_pomer(data_cropped,decomp);
%     mereni_parametru(index,6)=MSE;
%     mereni_parametru(index,7)=PSNR;
% end



%% Finální testování
mereni_parametru=zeros(1,7); % definování matice, do níž budou vkládány namìøené hodnoty
typ=1%promìnná - automatické cyklování rùzných variant
index=1;%indexace
VV=1;%promìnná 2 - automatické cyklování úrovní
for typ=1:1:1

    for uroven=1:1:1
    clear komprese;clear dekomprese;clear rekonstrukce;    
    metoda_komprese='Nazev';
    identifikator=strcat(metoda_komprese,num2str(uroven));
    
    tic;           %KOMPRESE|||||||||||||||||||||||||||||
    %metoda %1-ezw,2-spiht,3-stw,4-wdr,5-aswdr,6-lvl_mmc - velmi špatný,7-gbl_mmc_f - velmi špatný,8-gbl_mmc_h - velmi dobrý,9-spiht_3d
%     [komprese]=dwt_1d_komprese(data_cropped,typ,uroven)
%     [komprese]=dwt_2d_komprese(data_cropped,typ,uroven)
%     [komprese]=dwt_3d_komprese(data_cropped,typ,uroven)
%     [komprese,vektor_mat,prumer_exp]=klt_1d_komprese(data_cropped)
%     [komprese,pca_vektory,pca_prumer_mat]=pca_2d_komprese(data_cropped,VV)
%     [komprese,vl_vektor]=klt_2d_komprese(data_cropped)
%     [komprese] = dwt_3d_komp_matlab_dekompozice(data_cropped,1,5)
%     [komprese,pocet_koeficientu] = dwt_1d_komp_matlab_dekompozice(data_cropped,typ,uroven)
%     [komprese,pocet_koeficientu] = dwt_2d_komp_matlab_dekompozice(data_cropped,typ,uroven)  
%     [komprese,pocet_koeficientu] = dwt_3d_komp_matlab_dekompozice_call(data_cropped,typ,uroven)
    time_c1=toc;
        for met_komp=1:1:3
            tic; 
            clear jmeno_souboru_mat;clear dekomprese;clear rekonstrukce; 
    [cr_c,bpp_c,jmeno_souboru_mat]=jadro_komprese(komprese,met_komp,identifikator);
            time_c2=toc;

    tic;
     %DEKOMPRESE|||||||||||||||||||||||||||
    
    [dekomprese]=jadro_dekomprese(jmeno_souboru_mat,met_komp);
    
    if met_komp==9
        dekomprese=im2double(dekomprese);
    end
    
       

%     [rekonstrukce]=idwt_1d_dekomprese(dekomprese,typ,uroven)
%     [rekonstrukce]=idwt_2d_dekomprese(dekomprese,typ,uroven)
%     [rekonstrukce]=idwt_3d_dekomprese(dekomprese,typ,uroven)
%     [rekonstrukce1]=pca_2d_dekomprese(dekomprese,data_cropped,pca_vektory,pca_prumer_mat)
%     [rekonstrukce]=klt_2d_dekomprese(dekomprese,vl_vektor)
%     [rekonstrukce]=klt_1d_dekomprese(dekomprese,vektor_mat,prumer_exp)
%     [rekonstrukce] = dwt_1d_dekomp_matlab_dekompozice(dekomprese,pocet_koeficientu,typ)                               
%     [rekonstrukce] = dwt_2d_dekomp_matlab_dekompozice(dekomprese,pocet_koeficientu,typ)
%     [rekonstrukce] = dwt_3d_dekomp_matlab_dekompozice_call(dekomprese,typ,uroven,pocet_koeficientu)
    
    
    time_d=toc;
    %výpoèet parametrù

    [MSE,RMSE,MSE_matice]=MSE_vypocet(data_cropped,rekonstrukce);
    [PSNR,maximum]=PSNR_vypocet(data_cropped,rekonstrukce,MSE);
    
    mereni_parametru(index,1)=time_c1+time_c2;
    mereni_parametru(index,2)=time_d;
    mereni_parametru(index,3)=objem_dat(data_cropped);
    mereni_parametru(index,4)=(objem_dat(data_cropped))/cr_c; %nebo objem_dat(komprese);
    mereni_parametru(index,5)=cr_c;%kompresni pomer
    mereni_parametru(index,6)=bpp_c;%bits per pixel
    %mereni_parametru(index,7)=MSE;
    mereni_parametru(index,7)=PSNR;
    mereni_parametru(index,8)=typ;
    mereni_parametru(index,9)=VV;
    mereni_parametru(index,10)=met_komp;
    index=index+1;
    %clear rekonstrukce; clear PSNR; clear  MSE; clear time_d; clear objem_dat; clear RMSE;
    folder=strcat('F:\DIP\',identifikator,'_m',num2str(met_komp));
    xlswrite(folder,mereni_parametru); % export výsledkù do xml
    folder=strcat('F:\DIP\',identifikator,'_m',num2str(met_komp),'_jm');
    xlswrite(folder,jmeno_souboru_mat); % export názvù (pro pøípadné dodateèné dekódování
        end
        clear time_c;
    end
end



%% funkce

%__________________________________________________
% 3D Oøez hyperspektrálních dat 
%__________________________________________________

function vystup=hypersp_orez(vstup)
    [i,j,k]=size(vstup);
    spektrum=0;
        while spektrum == 0
        prompt = 'Zvolte poøadí vlnové délky k zobrazení - ';
        spektrum = input(prompt);
        if spektrum < 0 || spektrum > k
            disp('Neplatný vstup, opakujte vložení, prosím.')
            spektrum=0;
        else
            break;
        end
        end
    figure1=figure; imshow(vstup(:,:,spektrum),[]), title(['Náhled vstupních dat, øez ', num2str(spektrum), '. vlnové délky']);
    %saveas(figure1,'figure1.bmp')
    
        while 1 %%Oøez dat
                prompt = '[A/B/C] - ';
                disp('Zvolte zpùsob oøezu dat - ');
                disp('A - Obdélníkový výbìr');
                disp('B - Specifikace bodu a velikosti oblasti');
                disp('C - Manuální pomocí souøadnic');
                disp('D - Žádný oøez');
                str = input(prompt,'s');
                if str == 'A'           
                        % Obdélníková oblast je definována [xmin ymin width height]
                        orez = imrect();
                        orez = orez.getPosition();
                        % Zaokrouhlení
                        orez = round(orez);
                        %Rozšíøení na násobky 8
                        while mod(abs(orez(4)),8)~=0
                            orez(4)=orez(4)+1;
                        end
                        while mod(abs(orez(3)),8)~=0
                            orez(3)=orez(3)+1;
                        end
                        % Oøez
%                         vystup = zeros(orez(4),orez(3));
                        vystup = vstup(orez(2):(orez(2)+orez(4)-1),orez(1):(orez(1)+orez(3)-1),:);
                        disp(orez);
                        break;
                elseif str == 'B'           
                        % Bodová oblast je definována [xmin ymin], neboli [sloupec,radek]
                        orez = impoint();
                        orez = orez.getPosition();
                        % Zaokrouhlení
                        orez = round(orez);
                        while 1
                            disp('Zvolte požadovanou šíøku objektu');
                            disp('(poèet sloupcù vpravo od specifikovaného bodu)');
                            prompt = '[pix] - ';
                            sirka = input(prompt);
                            if sirka >= 1 && sirka+orez(1)<=j 
                                disp('OK');
                                break;
                            elseif orez(1)+sirka > j
                                disp('Výbìr sahá mimo hranice dat. Opakujte vložení, prosím.')
                            else
                                disp('Neplatný vstup, opakujte vložení, prosím.')
                            end
                        end
                        while 1
                            disp('Zvolte požadovanou výšku objektu');
                            disp('(poèet sloupcù dolù od specifikovaného bodu)');
                            prompt = '[pix] - ';
                            vyska = input(prompt);
                            if vyska >= 1 && vyska+orez(2)<=i 
                                disp('OK');
                                break;
                            elseif orez(2)+vyska > i 
                                disp('Výbìr sahá mimo hranice dat. Opakujte vložení, prosím.')
                            else
                                disp('Neplatný vstup, opakujte vložení, prosím.')
                            end
                        end
                        % Oøez
%                         vystup = zeros(orez(4),orez(3));
%                         while mod(sirka,8)~=0
%                             sirka=sirka+1;
%                         end
%                         while mod(vyska,8)~=0
%                             vyska=vyska+1;
%                         end
                        vystup = vstup(orez(2):orez(2)+vyska-1,orez(1):orez(1)+sirka-1,:);
                        disp(orez);
                        break;
                   elseif str == 'C'      
                        while 1
                        while 1
                            disp('Zvolte poèáteèní bod');
                            disp('(levý horní roh snímku)');
                            prompt = 'x [pix] - poøádí øádku - ';
                            orez(2) = input(prompt);
                            prompt = 'y [pix] - poøádí sloupce - ';
                            orez(1) = input(prompt);
                            if orez(1)<j && orez(1)>0 && orez(2)<i && orez(2)>0
                                disp('OK');
                                break;
                            else
                                disp('Neplatný vstup, opakujte vložení, prosím.')
                            end
                        end
                        while 1
                            disp('Zvolte požadovanou šíøku objektu');
                            disp('(poèet sloupcù vpravo od specifikovaného bodu)');
                            prompt = '[pix] - ';
                            sirka = input(prompt);
                            if sirka >= 1 && sirka+orez(1)-1<=j 
                                disp('OK');
                                break;
                            elseif orez(1)+sirka-1 > j
                                disp('Výbìr sahá mimo hranice dat. Opakujte vložení, prosím.')
                            else
                                disp('Neplatný vstup, opakujte vložení, prosím.')
                            end
                        end
                            disp('Zvolte požadovanou výšku objektu');
                            disp('(poèet sloupcù dolù od specifikovaného bodu)');
                            prompt = '[pix] - ';
                            vyska = input(prompt);
                            if vyska >= 1 && vyska+orez(2)-1<=i 
                                disp('OK');
                                break;
                            elseif orez(2)+vyska-1 > i 
                                disp('Výbìr sahá mimo hranice dat. Opakujte vložení, prosím.')
                            else
                                disp('Neplatný vstup, opakujte vložení, prosím.')
                            end
                        end
                        % Oøez
%                         vystup = zeros(orez(4),orez(3));
%                         while mod(sirka,8)~=0
%                             sirka=sirka+1;
%                         end
%                         while mod(vyska,8)~=0
%                             vyska=vyska+1;
%                         end
                        vystup = vstup(orez(2):orez(2)+vyska-1,orez(1):orez(1)+sirka-1,:);
                        disp(orez);
                        break;
                elseif str == 'D'
                        radky_cropped=i;
                        sloupce_cropped=j;
                        while mod(radky_cropped,8)~=0
                            radky_cropped=radky_cropped-1;
                        end
                        while mod(sloupce_cropped,8)~=0
                            sloupce_cropped=sloupce_cropped-1;
                        end  
%                         vystup=zeros(radky_cropped,sloupce_cropped);
                        vystup=vstup(1:radky_cropped,1:sloupce_cropped,:);
                        break;
                else
                    disp('Neplatný vstup, opakujte vložení, prosím.')
                end
        end
             figure2=figure; imshow(vystup(:,:,spektrum),[]), title(['Náhled vybraných dat, øez ', num2str(spektrum), '. vlnové délky']);
end

%__________________________________________________
% Naèítání hyperspektrálních dat
%__________________________________________________
   
function [aviris,i,j,k,metadata,vlnovadelka,idx_red,idx_green,idx_blue,idx_nir]=load_aviris(vstup)
    datRozm = [3428,744,224]; %  øádky, sloupce, frekvenèní pásma
    datTyp = 'int16'; % namìøení hodnoty jsou ve formì 16ti bitových celých èísel (data type 2)
    hOff = 0; % horizontální offset, viz pøiložená metadata
    interleaved = 'bip'; % typ øazení dat, zde Band-Interleaved-By-Pixel
    byteraz = 'ieee-be'; % øazení bytù, zde big-endian
    aviris = multibandread(vstup,datRozm,datTyp,hOff,interleaved,byteraz);
    [i,j,k]=size(aviris);
    vlnovadelka=xlsread('Documents\MATLAB\aviris_data\wavelengths.xlsx','B1:B224');
    kanal=1:1:k;
    kanal=transpose(kanal);
    metadata=zeros(k,3);
    metadata(:,1)=kanal;
    metadata(:,2)=vlnovadelka;
    metadata(:,3)=round(vlnovadelka);
    
    red_wavelength = 700;
    green_wavelength = 546.1;
    blue_wavelength = 435.8;
    nir_wavelength = 800;    

    %hledání nejlepší shody zadaných vlnových délek - èervená
    dif_red = abs (vlnovadelka-red_wavelength);
    idx_red = find(dif_red == min(dif_red));

    %hledání nejlepší shody zadaných vlnových délek - zelená
    dif_green = abs (vlnovadelka-green_wavelength);
    idx_green = find(dif_green == min(dif_green));

    %hledání nejlepší shody zadaných vlnových délek - modrá
    dif_blue = abs (vlnovadelka-blue_wavelength);
    idx_blue = find(dif_blue == min(dif_blue));

    %hledání nejlepší shody zadaných vlnových délek - NIR
    dif_nir = abs (vlnovadelka-nir_wavelength);
    idx_nir = find(dif_nir == min(dif_nir)); 
end

function [vystup,i,j,k,idx_red,idx_green,idx_blue,idx_nir]=load_landsat8()
    datRozm = [5000,5000,7];
    i=datRozm(1);j=datRozm(2);k=datRozm(3);
    kk=1;%indexace
    for kk = 1:1:k
        jmeno_souboru = strcat('LC08_CU_002008_20181108_20181124_C01_V01_SRB', num2str(kk), '.tif');
        kompletni_cesta = fullfile('Documents\MATLAB\landsat8_data\',jmeno_souboru);
        tmp = imread(kompletni_cesta);
        tmp = im2double(tmp);
        vystup(:,:,kk)=(tmp(:,:));
    end 
    %zdroj vlnových délek https://landsat.usgs.gov/what-are-band-designations-landsat-satellites
    idx_red=3;idx_green=2;idx_blue=1;idx_nir=4;
    [i,j,k] = size(vystup);
end

function [vystup,i,j,k,idx_red,idx_green,idx_blue,idx_nir]=load_hyperion()
    datRozm = [3351,1001,242];
    i=datRozm(1);j=datRozm(2);k=datRozm(3);
    kk=1;%indexace
    for kk = 1:1:k
        jmeno_souboru = strcat('EO1H0260472017068110KF_B', num2str(kk), '_L1T.TIF');
        kompletni_cesta = fullfile('Documents\MATLAB\hyperion_data\',jmeno_souboru);
        tmp = imread(kompletni_cesta);
        tmp = im2double(tmp);
        vystup(:,:,kk)=(tmp(:,:));
    end 
    %zdroj vlnových délek https://landsat.usgs.gov/what-are-band-designations-landsat-satellites
    idx_red=3;idx_green=2;idx_blue=1;idx_nir=4;
    [i,j,k] = size(vystup);
end

function [vystup,i,j,k,idx_red,idx_green,idx_blue,idx_nir]=load_sentinel2()
    datRozm = [5490,5490,6];
    i=datRozm(1);j=datRozm(2);k=datRozm(3);
    kk=1;%indexace
    for kk = 1:1:k
        jmeno_souboru = strcat('5490_T56JMS_20181126T000231_B', num2str(kk+4), '.jp2');
        kompletni_cesta = fullfile('Documents\MATLAB\sentinel2_data\GRANULE\L1C_T56JMS_A017902_20181126T000232\IMG_DATA\',jmeno_souboru);
        tmp = imread(kompletni_cesta);
        tmp = im2double(tmp);
        vystup(:,:,kk)=(tmp(:,:));
    end 
    %zdroj vlnových délek http://mres.uni-potsdam.de/index.php/2018/06/11/calculating-ndvi-maps-from-sentinel-2-data-with-matlab/
    idx_red=1;idx_green=2;idx_blue=3;idx_nir=4;
end

%__________________________________________________
% Komprese a dekomprese
%__________________________________________________

function [vystup] = dwt_1d_komprese(vstup,typ,uroven) %volací funkce
[i,j,k]=size(vstup); %dimenze vstupu
index=1;
tmp=zeros(i,j,k);
tmp(:,:,:)=vstup(:,:,:);
for index=1:1:uroven
    vystup=dwt_1d_fce(tmp,typ);
    tmp(:,:,:)=vystup(:,:,:);
end
end

function [vystup] = idwt_1d_dekomprese(vstup,typ,uroven) %volací funkce
[i,j,k]=size(vstup); %dimenze vstupu
index=1;
tmp=zeros(i,j,k);
tmp(:,:,:)=vstup(:,:,:);
for index=1:1:uroven
    vystup=idwt_1d_fce(tmp,typ);
    tmp(:,:,:)=vystup(:,:,:);
end
end

function [vystup] = dwt_2d_komprese(vstup,typ,uroven) %volací funkce
[i,j,k]=size(vstup); %dimenze vstupu
index=1;
tmp=zeros(i,j,k);
tmp(:,:,:)=vstup(:,:,:);
for index=1:1:uroven
    vystup=dwt_2d(tmp,typ);
    tmp(:,:,:)=vystup(:,:,:);
end
end

function [vystup] = idwt_2d_dekomprese(vstup,typ,uroven) %volací funkce
[i,j,k]=size(vstup); %dimenze vstupu
index=1;
tmp=zeros(i,j,k);
tmp(:,:,:)=vstup(:,:,:);
for index=1:1:uroven
    vystup=idwt_2d(tmp,typ);
    tmp(:,:,:)=vystup(:,:,:);
end
end

function [vystup] = dwt_3d_komprese(vstup,typ,uroven) %volací funkce
[i,j,k]=size(vstup); %dimenze vstupu
index=1;
tmp=zeros(i,j,k);
tmp(:,:,:)=vstup(:,:,:);
for index=1:1:uroven
    vystup=dwt_3d(tmp,typ);
    tmp(:,:,:)=vystup(:,:,:);
end
end



function [vystup] = idwt_3d_dekomprese(vstup,typ,uroven) %volací funkce
[i,j,k]=size(vstup); %dimenze vstupu
index=1;
tmp=zeros(i,j,k);
tmp(:,:,:)=vstup(:,:,:);
for index=1:1:uroven
    vystup=idwt_3d(tmp,typ);
    tmp(:,:,:)=vystup(:,:,:);
end
end

function [vystup] = dwt_1d(vstup,typ) %funkce nahrazující interní DWT programu Matlab

string name;
        if (typ == 1) %Haar
            name = 'haar';
        elseif (typ == 2) %Daubechies 
            name = 'db3';
        elseif (typ == 3) %Symlets
            name = 'sym3';
        elseif (typ == 4) %Biorthogonal
            name = 'bior3.5';
        elseif (typ == 5) %Reverse Biorthogonal
            name = 'rbio3.5';
        elseif (typ == 6) %Coiflets
            name = 'coif3';   
        elseif (typ == 7) %Fejer-Korovkin filters
            name = 'fk4'; 
        end
        

[Lo_D,Hi_D]  = wfilters(name);  

delka_vstup = length(vstup);
delka_filtr = (length(Lo_D));             

delka_vstup = length(vstup);
vstup = [vstup(mod((-(delka_filtr-1):-1),delka_vstup)+1) vstup];          

xl_1 = conv(vstup,Lo_D);   xl_1 = xl_1(delka_filtr:2:(delka_filtr+delka_vstup-2));  
xh_1 = conv(vstup,Hi_D);   xh_1 = xh_1(delka_filtr:2:(delka_filtr+delka_vstup-2));

vystup = [xl_1,xh_1];
end

function [vystup] = idwt_1d(vstup,typ) %funkce nahrazuující interní iDWT programu Matlab

string name;
        if (typ == 1) %Haar
            name = 'haar';
        elseif (typ == 2) %Daubechies 
            name = 'db3';
        elseif (typ == 3) %Symlets
            name = 'sym3';
        elseif (typ == 4) %Biorthogonal
            name = 'bior3.5';
        elseif (typ == 5) %Reverse Biorthogonal
            name = 'rbio3.5';
        elseif (typ == 6) %Coiflets
            name = 'coif3';   
        elseif (typ == 7) %Fejer-Korovkin filters
            name = 'fk4'; 
        end
        
[Lo_D,Hi_D,Lo_R,Hi_R]  = wfilters(name);  

delka_vstup = length(vstup);   
delka_filtr = length(Lo_R);

stred_hod = delka_vstup/2;  
per  = mod(0:delka_filtr/2-1,stred_hod)+1;   

xl_1  = vstup(1:stred_hod);                           
xl_1_up(1:2:delka_vstup+delka_filtr) = [xl_1 xl_1(1,per)];                    

xh_1  = vstup(stred_hod+1:delka_vstup);                            
xh_1_up(1:2:delka_vstup+delka_filtr) = [xh_1 xh_1(1,per)];              
       
konvoluce  = conv(xl_1_up,Lo_R) + conv(xh_1_up,Hi_R); 

vystup  = konvoluce(delka_filtr:delka_filtr+delka_vstup-1);     

end

function [vystup] = dwt_2d(vstup,typ) %funkce nahraující interní fci dwt2d Matlabu
[i,j,k]=size(vstup); %dimenze vstupu
index=1;ii=1;jj=1;kk=1; %indexace
dwt_radek=zeros(i,j,k); %pomocná matice
vystup=zeros(i,j,k); %dimenze výstupu
    kk=1;
    for kk=1:1:k
    ii=1;jj=1;index=1;    
    %dwt v rámci øádku
        for index=1:1:i
            tmp=zeros(1,j); %pomocný øádek
            tmp(1,1:j)=vstup(index,1:j,kk);
            tmp(1,1:j)=dwt_1d(tmp,typ);
            dwt_radek(index,1:j,kk)=tmp(1,1:j);
        end
    %dwt v rámci sloupce
        for index=1:1:j
            tmp=zeros(1, i); %pomocný øádek
            tmp(1,1:i)=dwt_radek(1:i,index,kk)';
            tmp(1,1:i)=dwt_1d(tmp,typ);
            vystup(1:i,index,kk)=tmp(1,1:i)';
        end
    end
end

function [vystup] = idwt_2d(vstup,typ) %funkce nahrazují interní fci dwt2D Matlabu
[i,j,k]=size(vstup); %dimenze vstupu
index=1;ii=1;jj=1;kk=1; %indexace
idwt_sloupec=zeros(i,j,k); %pomocná matice
vystup=zeros(i,j,k); %dimenze výstupu
    kk=1;
    for kk=1:1:k
    ii=1;jj=1;index=1;    
    %idwt v rámci sloupce
        for index=1:1:j
            tmp=zeros(1,i); %pomocný øádek
            tmp(1,1:i)=vstup(1:i,index,kk)';
            tmp(1,1:i)=idwt_1d(tmp,typ);
            idwt_sloupec(1:i,index,kk)=tmp(1,1:i)';
        end
    %idwt v rámci øádku
        for index=1:1:i
            tmp=zeros(1,j); %pomocný øádek
            tmp(1,1:j)=idwt_sloupec(index,1:j,kk);
            tmp(1,1:j)=idwt_1d(tmp,typ);
            vystup(index,1:j,kk)=tmp(1,1:j);
        end  
    end
end

function [vystup] = dwt_3d(vstup,typ) %funkce nahrazují interní fci dwt3D Matlabu
[i,j,k]=size(vstup); %dimenze vstupu
index=1;ii=1;jj=1;kk=1; %indexace
dwt_radek=zeros(i,j,k); %pomocná matice
dwt_sloupec=zeros(i,j,k); %pomocná matice
vystup=zeros(i,j,k); %dimenze výstupu
    kk=1;
    for kk=1:1:k
    ii=1;jj=1;index=1;    
    %dwt v rámci øádku
        for index=1:1:i
            tmp=zeros(1,j); %pomocný øádek
            tmp(1,1:j)=vstup(index,1:j,kk);
            tmp(1,1:j)=dwt_1d(tmp,typ);
            dwt_radek(index,1:j,kk)=tmp(1,1:j);
        end
    %dwt v rámci sloupce
        for index=1:1:j
            tmp=zeros(1,i); %pomocný øádek
            tmp(1,1:i)=dwt_radek(1:i,index,kk)';
            tmp(1,1:i)=dwt_1d(tmp,typ);
            dwt_sloupec(1:i,index,kk)=tmp(1,1:i)';
        end
    end
    %dwt v rámci tøetí dimenze
        for jj=1:1:j
            for ii=1:1:i
                tmp=zeros(1,k); %pomocný øádek
                tmp(1,1:k)=dwt_sloupec(ii,jj,1:k);
                tmp(1,1:k)=dwt_1d(tmp,typ);
                vystup(ii,jj,1:k)=tmp(1,1:k);
            end
        end
end

function [vystup] = idwt_3d(vstup,typ) %funkce nahrazují interní fci idwt3D Matlabu
[i,j,k]=size(vstup); %dimenze vstupu
index=1;ii=1;jj=1;kk=1; %indexace
idwt_sloupec=zeros(i,j,k); %pomocná matice
idwt_spektra=zeros(i,j,k); %pomocná matice
vystup=zeros(i,j,k); %dimenze výstupu
ii=1;jj=1;index=1;   
    %idwt v rámci tøetí dimenze
        for jj=1:1:j
            for ii=1:1:i
                tmp=zeros(1,k); %pomocný øádek
                tmp(1,1:k)=vstup(ii,jj,1:k);
                tmp(1,1:k)=idwt_1d(tmp,typ);
                idwt_spektra(ii,jj,1:k)=tmp(1,1:k);
            end
        end
    kk=1;
    for kk=1:1:k
    %idwt v rámci sloupce
        for index=1:1:j
            tmp=zeros(1,i); %pomocný øádek
            tmp(1,1:i)=idwt_spektra(1:i,index,kk)';
            tmp(1,1:i)=idwt_1d(tmp,typ);
            idwt_sloupec(1:i,index,kk)=tmp(1,1:i)';
        end
    %idwt v rámci øádku
        for index=1:1:i
            tmp=zeros(1,j); %pomocný øádek
            tmp(1,1:j)=idwt_sloupec(index,1:j,kk);
            tmp(1,1:j)=idwt_1d(tmp,typ);
            vystup(index,1:j,kk)=tmp(1,1:j);
        end  
    end
end

function [vystup] = dwt_1d_fce(vstup,typ)
[i,j,k]=size(vstup); %dimenze vstupu
index=1;ii=1;jj=1;kk=1; %indexace
dwt_radek=zeros(i,j,k); %pomocná matice
dwt_sloupec=zeros(i,j,k); %pomocná matice
vystup=zeros(i,j,k); %dimenze výstupu
        for jj=1:1:j
            for ii=1:1:i
                tmp=zeros(1,k); %pomocný øádek
                tmp(1,1:k)=vstup(ii,jj,1:k);
                tmp(1,1:k)=dwt_1d(tmp,typ);
                vystup(ii,jj,1:k)=tmp(1,1:k);
            end
        end
end

function [vystup] = idwt_1d_fce(vstup,typ)
[i,j,k]=size(vstup); %dimenze vstupu
index=1;ii=1;jj=1;kk=1; %indexace
idwt_sloupec=zeros(i,j,k); %pomocná matice
idwt_spektra=zeros(i,j,k); %pomocná matice
vystup=zeros(i,j,k); %dimenze výstupu
ii=1;jj=1;index=1;   
    %idwt v rámci tøetí dimenze
        for jj=1:1:j
            for ii=1:1:i
                tmp=zeros(1,k); %pomocný øádek
                tmp(1,1:k)=vstup(ii,jj,1:k);
                tmp(1,1:k)=idwt_1d(tmp,typ);
                vystup(ii,jj,1:k)=tmp(1,1:k);
            end
        end
end

function [vystup,pocet_koeficientu] = dwt_1d_komp_matlab_dekompozice(vstup,typ,uroven)
[i,j,k]=size(vstup);
string name;
        if (typ == 1) %Haar
            name = 'haar';
        elseif (typ == 2) %Daubechies 
            name = 'db3';
        elseif (typ == 3) %Symlets
            name = 'sym3';
        elseif (typ == 4) %Biorthogonal
            name = 'bior3.5';
        elseif (typ == 5) %Reverse Biorthogonal
            name = 'rbio3.5';
        elseif (typ == 6) %Coiflets
            name = 'coif3';   
        elseif (typ == 7) %Fejer-Korovkin filters
            name = 'fk4'; 
        end       
        for jj=1:1:j
            for ii=1:1:i
                tmp(1,:)=vstup(ii,jj,:);
                [dek,p_koe]=wavedec(tmp,uroven,name);
                vystup(ii,jj,:)=dek;
                pocet_koeficientu=p_koe;
%                 M = 2.7*prod(s(1,:)); %definování poètu nejhrubšího aprox. coef
%                 [THR,NKEEP]=wdcbm(dekompozice(ii,jj),pocet_koeficientu(ii,jj),1.5,name);
%                 [tmp_vystup,CXC,LXC]=wdencmp('lvd',dekompozice(ii,jj),pocet_koeficientu(i,jj),name,uroven,THR,'h'); %h-hard thresholding, lvd - pro 1D pøípad (thr je vektor)
            end
        end            
end

function [vystup] = dwt_1d_dekomp_matlab_dekompozice(vstup,pocet_koeficientu,typ)
[i,j,k]=size(vstup);
string name;
        if (typ == 1) %Haar
            name = 'haar';
        elseif (typ == 2) %Daubechies 
            name = 'db3';
        elseif (typ == 3) %Symlets
            name = 'sym3';
        elseif (typ == 4) %Biorthogonal
            name = 'bior3.5';
        elseif (typ == 5) %Reverse Biorthogonal
            name = 'rbio3.5';
        elseif (typ == 6) %Coiflets
            name = 'coif3';   
        elseif (typ == 7) %Fejer-Korovkin filters
            name = 'fk4'; 
        end       
        for jj=1:1:j
            for ii=1:1:i
                dek(1,:)=vstup(ii,jj,:);
                p_koe=pocet_koeficientu;
                [tmp_vystup]=waverec(dek,p_koe,name);
                vystup(ii,jj,1:length(tmp_vystup))=tmp_vystup;
            end
        end            
end

function [vystup,pocet_koeficientu] = dwt_2d_komp_matlab_dekompozice(vstup,typ,uroven)
[i,j,k]=size(vstup);
string name;
        if (typ == 1) %Haar
            name = 'haar';
        elseif (typ == 2) %Daubechies 
            name = 'db3';
        elseif (typ == 3) %Symlets
            name = 'sym3';
        elseif (typ == 4) %Biorthogonal
            name = 'bior3.5';
        elseif (typ == 5) %Reverse Biorthogonal
            name = 'rbio3.5';
        elseif (typ == 6) %Coiflets
            name = 'coif3';   
        elseif (typ == 7) %Fejer-Korovkin filters
            name = 'fk4'; 
        end       
        
        for kk=1:1:k
                tmp(:,:)=vstup(:,:,kk);
                [dekompozice_radek,pocet_koef]=wavedec2(tmp,1,name);
                pocet_koeficientu(:,:)=pocet_koef;
                
                dim_r=pocet_koeficientu(1,1);%rozmìr dekomponovaného snímku (radky);
                dim_c=pocet_koeficientu(1,2);%rozmìr dekomponovaného snímku (sloupce);
                dim_clk_r=pocet_koeficientu(3,1);
                dim_clk_c=pocet_koeficientu(3,2);
                
                dim2=dim_r*dim_c;%rozmìr dekomponovaneho snimku (v pixelech)
                
                cA=dekompozice_radek(1:dim2); %transponovano a otoceno o 180 %cA~LL
                cA=cA(1:((dim_clk_r/2)*(dim_clk_c/2))); %oøíznutí nadbyteèných èástí 
                cA=radek_do_matice_dim(cA,dim_clk_c/2,dim_clk_r/2,1);
                cA=rot90(cA,2);
                cA=cA' 
                cA=rot90(cA,2);
                
                cH=dekompozice_radek(dim2+1:2*dim2); %transponovano a otoceno o 180
                cH=cH(1:((dim_clk_r/2)*(dim_clk_c/2))); %oøíznutí nadbyteèných èástí 
                cH=radek_do_matice_dim(cH,dim_clk_c/2,dim_clk_r/2,1);
                cH=cH' 
            %     HL=rot90(HL,2);
                
                cV=dekompozice_radek(2*dim2+1:3*dim2); %transponovano a otoceno o 180
                cV=cV(1:((dim_clk_r/2)*(dim_clk_c/2))); %oøíznutí nadbyteèných èástí 
                cV=radek_do_matice_dim(cV,dim_clk_c/2,dim_clk_r/2,1);
                cV=cV' 
            %     LH=rot90(LH,2);
                
                cD=dekompozice_radek(3*dim2+1:4*dim2); %transponovano a otoceno o 180
                cD=cD(1:((dim_clk_r/2)*(dim_clk_c/2))); %oøíznutí nadbyteèných èástí 
                cD=radek_do_matice_dim(cD,dim_clk_c/2,dim_clk_r/2,1);
                cD=rot90(cD,2);
                cD=cD' 
                cD=rot90(cD,2);
                
                dim_r=dim_clk_r/2;
                dim_c=dim_clk_c/2;
                
                pocet_koeficientu(1,1)=pocet_koeficientu(3,1)/2;
                pocet_koeficientu(1,2)=pocet_koeficientu(3,2)/2;
                
                pocet_koeficientu(2,1)=pocet_koeficientu(3,1)/2;
                pocet_koeficientu(2,2)=pocet_koeficientu(3,2)/2;
                
                kompletace_tmp=zeros(dim_clk_r,dim_clk_c);
                kompletace_tmp(1:dim_r,1:dim_c)=cA;kompletace_tmp(1:dim_r,dim_c+1:2*dim_c)=cV;
                kompletace_tmp(dim_r+1:2*dim_r,1:dim_c)=cH;kompletace_tmp(dim_r+1:2*dim_r,dim_c+1:2*dim_c)=cD;
                vystup(:,:,kk)=kompletace_tmp(:,:);
            end
        end            

function [vystup] = dwt_2d_dekomp_matlab_dekompozice(vstup,pocet_koeficientu,typ)
[i,j,k]=size(vstup);
string name;
        if (typ == 1) %Haar
            name = 'haar';
        elseif (typ == 2) %Daubechies 
            name = 'db3';
        elseif (typ == 3) %Symlets
            name = 'sym3';
        elseif (typ == 4) %Biorthogonal
            name = 'bior3.5';
        elseif (typ == 5) %Reverse Biorthogonal
            name = 'rbio3.5';
        elseif (typ == 6) %Coiflets
            name = 'coif3';   
        elseif (typ == 7) %Fejer-Korovkin filters
            name = 'fk4'; 
        end      
        
        dim_r=pocet_koeficientu(1,1);%rozmìr dekomponovaného snímku (radky);
        dim_c=pocet_koeficientu(1,2);%rozmìr dekomponovaného snímku (sloupce);
        dim_clk_r=pocet_koeficientu(3,1);
        dim_clk_c=pocet_koeficientu(3,2); 
        
        
        for kk=1:1:k
                
                tmp2(:,:)=vstup(:,:,kk);
                
                cA_mat=tmp2(1:dim_r,1:dim_c);
                cA_mat=rot90(cA_mat,2);
                cA_mat=cA_mat';
                cA_mat=rot90(cA_mat,2);
                cA=matice_do_radku_dim(cA_mat);
                 
                cV_mat=tmp2(1:dim_r,dim_c+1:2*dim_c);
                cV_mat=cV_mat';
                %cV_mat=rot90(cV_mat,2);
                cV=matice_do_radku_dim(cV_mat);
                
                cH_mat=tmp2(dim_r+1:2*dim_r,1:dim_c);
                cH_mat=cH_mat';
                cH=matice_do_radku_dim(cH_mat);
                
                cD_mat=tmp2(dim_r+1:2*dim_r,dim_c+1:2*dim_c);
                cD_mat=rot90(cD_mat,2);
                cD_mat=cD_mat';
                cD_mat=rot90(cD_mat,2);
                cD=matice_do_radku_dim(cD_mat);
                
                kompletace=[cA cH cV cD];
                tmp_vystup = waverec2(kompletace,pocet_koeficientu,name);
                vystup(:,:,kk)=tmp_vystup;
 
        end
end            

function [vystup,pocet_koeficientu] = dwt_3d_komp_matlab_dekompozice_call(vstup,typ,uroven) %volací funkce
[i,j,k]=size(vstup); %dimenze vstupu
index=1;
tmp=zeros(i,j,k);
tmp(:,:,:)=vstup(:,:,:);
for index=1:1:uroven
    [vystup,pocet_koeficientu]=dwt_3d_komp_matlab_dekompozice(tmp,typ);
    tmp=vystup;
end
end

function [vystup] = dwt_3d_dekomp_matlab_dekompozice_call(vstup,typ,uroven,pocet_koeficientu) %volací funkce
[i,j,k]=size(vstup); %dimenze vstupu
index=1;
tmp=zeros(i,j,k);
tmp(:,:,:)=vstup(:,:,:);
for index=1:1:uroven
    vystup=dwt_3d_dekomp_matlab_dekompozice(tmp,typ,pocet_koeficientu);
    tmp=vystup;
end
end

function [vystup,pocet_koeficientu] = dwt_3d_komp_matlab_dekompozice(vstup,typ)
[i,j,k]=size(vstup);
string name;
        if (typ == 1) %Haar
            name = 'haar';
        elseif (typ == 2) %Daubechies 
            name = 'db3';
        elseif (typ == 3) %Symlets
            name = 'sym3';
        elseif (typ == 4) %Biorthogonal
            name = 'bior3.5';
        elseif (typ == 5) %Reverse Biorthogonal
            name = 'rbio3.5';
        elseif (typ == 6) %Coiflets
            name = 'coif3';   
        elseif (typ == 7) %Fejer-Korovkin filters
            name = 'fk4'; 
        end   
        for kk=1:1:k
                tmp(:,:)=vstup(:,:,kk);
                [dekompozice_radek,pocet_koef]=wavedec2(tmp,1,name);
                pocet_koeficientu(:,:)=pocet_koef;
                
                dim_r=pocet_koeficientu(1,1);%rozmìr dekomponovaného snímku (radky);
                dim_c=pocet_koeficientu(1,2);%rozmìr dekomponovaného snímku (sloupce);
                dim_clk_r=pocet_koeficientu(3,1);
                dim_clk_c=pocet_koeficientu(3,2);
                
                dim2=dim_r*dim_c;%rozmìr dekomponovaneho snimku (v pixelech)
                
                cA=dekompozice_radek(1:dim2); %transponovano a otoceno o 180 %cA~LL
                cA=cA(1:((dim_clk_r/2)*(dim_clk_c/2))); %oøíznutí nadbyteèných èástí 
                cA=radek_do_matice_dim(cA,dim_clk_c/2,dim_clk_r/2,1);
                cA=rot90(cA,2);
                cA=cA' 
                cA=rot90(cA,2);
                
                cH=dekompozice_radek(dim2+1:2*dim2); %transponovano a otoceno o 180
                cH=cH(1:((dim_clk_r/2)*(dim_clk_c/2))); %oøíznutí nadbyteèných èástí 
                cH=radek_do_matice_dim(cH,dim_clk_c/2,dim_clk_r/2,1);
                cH=cH' 
            %     HL=rot90(HL,2);
                
                cV=dekompozice_radek(2*dim2+1:3*dim2); %transponovano a otoceno o 180
                cV=cV(1:((dim_clk_r/2)*(dim_clk_c/2))); %oøíznutí nadbyteèných èástí 
                cV=radek_do_matice_dim(cV,dim_clk_c/2,dim_clk_r/2,1);
                cV=cV' 
            %     LH=rot90(LH,2);
                
                cD=dekompozice_radek(3*dim2+1:4*dim2); %transponovano a otoceno o 180
                cD=cD(1:((dim_clk_r/2)*(dim_clk_c/2))); %oøíznutí nadbyteèných èástí 
                cD=radek_do_matice_dim(cD,dim_clk_c/2,dim_clk_r/2,1);
                cD=rot90(cD,2);
                cD=cD' 
                cD=rot90(cD,2);
                
                dim_r=dim_clk_r/2;
                dim_c=dim_clk_c/2;
                
                pocet_koeficientu(1,1)=pocet_koeficientu(3,1)/2;
                pocet_koeficientu(1,2)=pocet_koeficientu(3,2)/2;
                
                pocet_koeficientu(2,1)=pocet_koeficientu(3,1)/2;
                pocet_koeficientu(2,2)=pocet_koeficientu(3,2)/2;
                
                kompletace_tmp=zeros(dim_clk_r,dim_clk_c);
                kompletace_tmp(1:dim_r,1:dim_c)=cA;kompletace_tmp(1:dim_r,dim_c+1:2*dim_c)=cV;
                kompletace_tmp(dim_r+1:2*dim_r,1:dim_c)=cH;kompletace_tmp(dim_r+1:2*dim_r,dim_c+1:2*dim_c)=cD;
                kompletace_2d(:,:,kk)=kompletace_tmp(:,:);    
        end   
                        for jj=1:1:j %tøetí dimenze
                            for ii=1:1:i
                                tmp_2(1,:)=kompletace_2d(ii,jj,1:k);
                                [tmp_vystup,l_1d] = wavedec(tmp_2,1,name);
                                pocet_koeficientu(1:length(l_1d),3)=l_1d;
                                pocet_koeficientu(1,3)=pocet_koeficientu(3,3)/2;
                                pocet_koeficientu(2,3)=pocet_koeficientu(3,3)/2;
                                vystup(ii,jj,:)=tmp_vystup(1:k);
                            end
                        end

end
                

       

function [vystup] = dwt_3d_dekomp_matlab_dekompozice(vstup,typ,pocet_koeficientu)
[i,j,k]=size(vstup);
string name;
        if (typ == 1) %Haar
            name = 'haar';
        elseif (typ == 2) %Daubechies 
            name = 'db3';
        elseif (typ == 3) %Symlets
            name = 'sym3';
        elseif (typ == 4) %Biorthogonal
            name = 'bior3.5';
        elseif (typ == 5) %Reverse Biorthogonal
            name = 'rbio3.5';
        elseif (typ == 6) %Coiflets
            name = 'coif3';   
        elseif (typ == 7) %Fejer-Korovkin filters
            name = 'fk4'; 
        end       
      
        dim_r=pocet_koeficientu(1,1);%rozmìr dekomponovaného snímku (radky);
        dim_c=pocet_koeficientu(1,2);%rozmìr dekomponovaného snímku (sloupce);
        dim_clk_r=pocet_koeficientu(3,1);
        dim_clk_c=pocet_koeficientu(3,2); 
        koeficienty_3d=pocet_koeficientu(:,3);
        koeficienty_2d=pocet_koeficientu(:,1:2);
        
        for jj=1:1:j %tøetí dimenze
            for ii=1:1:i
            [i,j,k]=size(vstup);
            
            tmp(1,:)=vstup(ii,jj,:);
            [tmp_vystup] = waverec(tmp,koeficienty_3d,name);
            kompletace_1d(ii,jj,1:length(tmp_vystup))=tmp_vystup;
            end
        end        
        
        for kk=1:1:k
                [i,j,k]=size(kompletace_1d);
                
                tmp2(:,:)=kompletace_1d(:,:,kk);
                
                cA_mat=tmp2(1:dim_r,1:dim_c);
                cA_mat=rot90(cA_mat,2);
                cA_mat=cA_mat';
                cA_mat=rot90(cA_mat,2);
                cA=matice_do_radku_dim(cA_mat);
                 
                cV_mat=tmp2(1:dim_r,dim_c+1:2*dim_c);
                cV_mat=cV_mat';
                %cV_mat=rot90(cV_mat,2);
                cV=matice_do_radku_dim(cV_mat);
                
                cH_mat=tmp2(dim_r+1:2*dim_r,1:dim_c);
                cH_mat=cH_mat';
                cH=matice_do_radku_dim(cH_mat);
                
                cD_mat=tmp2(dim_r+1:2*dim_r,dim_c+1:2*dim_c);
                cD_mat=rot90(cD_mat,2);
                cD_mat=cD_mat';
                cD_mat=rot90(cD_mat,2);
                cD=matice_do_radku_dim(cD_mat);
                
                kompletace=[cA cH cV cD];
                tmp_vystup2 = waverec2(kompletace,koeficienty_2d,name);
                vystup(:,:,kk)=tmp_vystup2;
       
                
        end
end    

function [cr_c,bpp_c,jmeno_souboru_mat]=jadro_komprese(vstup,typ,identifikator);
[i,j,k]=size(vstup);
sum_cr=0;
sum_bpp=0;
index=1;
string metoda;
        if (typ == 1) %Embedded Zerotree Wavelet
            metoda = 'ezw';
        elseif (typ == 2) %Set Partitioning In Hierarchical Trees
            metoda = 'spiht';
        elseif (typ == 3) %Spatial-orientation Tree Wavelet
            metoda = 'stw';
        elseif (typ == 4) %Wavelet Difference Reduction
            metoda = 'wdr';
        elseif (typ == 5) %Adaptively Scanned Wavelet Difference Reduction
            metoda = 'aswdr';
        elseif (typ == 6) %Subband thresholding of coefficients and Huffman encoding
            metoda = 'lvl_mmc';  
        elseif (typ == 7) %Global thresholding of coefficients and fixed encoding
            metoda = 'gbl_mmc_f'; 
        elseif (typ == 8) %Global thresholding of coefficients and Huffman encoding
            metoda = 'gbl_mmc_h'; 
        elseif (typ == 9) %Set Partitioning In Hierarchical Trees 3D for truecolor images
            metoda = 'spiht_3d';   
        end  
        
        if typ==9
            for kk=1:3:k-2
            jmeno_souboru = strcat(identifikator,'_m',metoda,num2str(kk),'.wtc'); %jmeno grafu            tmp=vstup(:,:,kk:kk+2);
            tmp=vstup(:,:,kk:kk+2);
            [cr,bpp] = wcompress('c',tmp,jmeno_souboru,metoda);
            jmeno_souboru_str=convertCharsToStrings(jmeno_souboru);
            jmeno_souboru_mat(index,1)=jmeno_souboru_str;
            index=index+1;
            sum_cr=sum_cr+cr;
            sum_bpp=sum_bpp+bpp;
            if kk==k-2
                cr_c=sum_cr/(k/3);
                bpp_c=sum_bpp/(k/3);
                break;
            end
            end            
        else
            for kk=1:1:k
            jmeno_souboru = strcat(identifikator,'_m',metoda,num2str(kk),'.wtc'); %jmeno grafu 
            tmp=vstup(:,:,kk);
            [cr,bpp] = wcompress('c',tmp,jmeno_souboru,metoda);
            jmeno_souboru_str=convertCharsToStrings(jmeno_souboru);
            jmeno_souboru_mat(kk,1)=jmeno_souboru_str;
            sum_cr=sum_cr+cr;
            sum_bpp=sum_bpp+bpp;
            if kk==k
                cr_c=sum_cr/k;
                bpp_c=sum_bpp/k;
                break;
            end
            end
        end
    
end

function [vystup]=jadro_dekomprese(jmeno_souboru_mat,typ);
[k,x]=size(jmeno_souboru_mat);
clear x;
index=1;
string metoda;
        if (typ == 1) %Embedded Zerotree Wavelet
            metoda = 'ezw';
        elseif (typ == 2) %Set Partitioning In Hierarchical Trees
            metoda = 'spiht';
        elseif (typ == 3) %Spatial-orientation Tree Wavelet
            metoda = 'stw';
        elseif (typ == 4) %Wavelet Difference Reduction
            metoda = 'wdr';
        elseif (typ == 5) %Adaptively Scanned Wavelet Difference Reduction
            metoda = 'aswdr';
        elseif (typ == 6) %Subband thresholding of coefficients and Huffman encoding
            metoda = 'lvl_mmc';  
        elseif (typ == 7) %Global thresholding of coefficients and fixed encoding
            metoda = 'gbl_mmc_f'; 
        elseif (typ == 8) %Global thresholding of coefficients and Huffman encoding
            metoda = 'gbl_mmc_h'; 
        elseif (typ == 9) %Set Partitioning In Hierarchical Trees 3D for truecolor images
            metoda = 'spiht_3d';   
        end  
        
        if typ==9
            for kk=1:1:k
            jmeno_souboru_str = jmeno_souboru_mat(kk,1);
            jmeno_souboru=char(jmeno_souboru_str);
            tmp_vystup = wcompress('u',jmeno_souboru);
            vystup(:,:,index:index+2)=tmp_vystup(:,:,:);
            index=index+3;
            if kk==k
                break;
            end
            end            
        else
            for kk=1:1:k
            jmeno_souboru_str = jmeno_souboru_mat(kk,1);
            jmeno_souboru=char(jmeno_souboru_str);
            tmp_vystup = wcompress('u',jmeno_souboru);
            vystup(:,:,kk)=tmp_vystup(:,:);
            if kk==k
                break;
            end
            end
        end
    
end
        
function [vystup]=rle_komprese(vstup)
%vstup=matice_do_radku(vstup); %pøeformátování matice do øádku
L=length(vstup);
j=1;k=1;i=1;
    while i<2*L
        comp=1;
        for j=j:L
            if j==L 
                break
            end 
             if vstup(j)==vstup(j+1)
                comp=comp+1;
            else
                break
             end
        end
            vystup(k+1)=comp;
            vystup(k)=vstup(j);
            if j==L && vstup(j-1)==vstup(j) 
                break
            end  
            i=i+1;
            k=k+2;
            j=j+1;
            if j==L 
                if mod(L,2)==0 
                vystup(k+1)=1;
                vystup(k)=vstup(j);
                else
                vystup(k+1)=1;    
                vystup(k)=vstup(j);
                           end
                 break
            end
    end 
end

function [vystup]=rle_dekomprese(vstup)
L=length(vstup);
s=1;
k=1;
i=1;
    while i<=L
        while s<=vstup(i+1)
            vystup(k)=vstup(i);
            s=s+1;
            k=k+1;
        end
        i=i+2;
        s=1;
    end
%vystup=radek_do_matice(vystup,puv_obr) %pøeformátování do matice
end

function [vystup,center_val]=dct_2d_komprese(vstup,q)
if q == 100
    kval=1;
else
    kval=(100-q)/100;
end
[i,j,k]= size(vstup);  %dimenze vstupu
vystup = zeros(i,j,k); %dimenze vystupu
% Centerování dat kolem nuly (pro 16bit data odeèítám (2^16)/2 ~ 32768, pro 8bit by to bylo 256/2=128
%bit=16; %bitová hloubka obrazové informace
%center_val=(2^bit)/2;
center_val=mean(mean(mean(vstup)))/2;
center_mat=(center_val*ones(i,j,k));
vstup=vstup-center_mat;
clear center_mat;
d_mat = dct(eye(8)); %dopøedná matice DCT 
id_mat = d_mat'; %inverzní matice iDCT
sk_mat = [ 16 11 10 16 24 40 51 61; %škálovací matice
     12 12 14 19 26 58 60 55;
     14 13 16 24 40 57 69 56;
     14 17 22 29 51 87 80 62; 
     18 22 37 56 68 109 103 77;
     24 35 55 64 81 104 113 92;
     49 64 78 87 103 121 120 101;
     72 92 95 98 112 100 103 99];
sk_mat = round(sk_mat.*(ones(8)*kval)); 
%dopøedná dct
for kk=1:1:k
    for ii=1:8:i
        for jj=1:8:j
            segment=vstup(ii:ii+7,jj:jj+7,kk);
            tmp=d_mat*segment*id_mat;
            dct_domain(ii:ii+7,jj:jj+7)=tmp;
        end
    end
    %škálování koeficientù
    for ii=1:8:i
        for jj=1:8:j
            tmp = dct_domain(ii:ii+7,jj:jj+7);
            if q == 100
                tmp2=(tmp./sk_mat);
            else
                tmp2=round(tmp./sk_mat);%zaokrouhlování
            end
            vystup(ii:ii+7,jj:jj+7,kk)=tmp2;
        end
    end
end
 end

function [vystup]=dct_2d_dekomprese(vstup,q,center_val)
if q == 100
    kval=1;
else
    kval=(100-q)/100;
end
[i,j,k]= size(vstup);  %dimenze vstupu
vystup = zeros(i,j,k); %dimenze vystupu
d_mat = dct(eye(8)); %dopøedná matice DCT 
id_mat = d_mat'; %inverzní matice iDCT
sk_mat = [ 16 11 10 16 24 40 51 61; %škálovací matice
     12 12 14 19 26 58 60 55;
     14 13 16 24 40 57 69 56;
     14 17 22 29 51 87 80 62; 
     18 22 37 56 68 109 103 77;
     24 35 55 64 81 104 113 92;
     49 64 78 87 103 121 120 101;
     72 92 95 98 112 100 103 99];
sk_mat = round(sk_mat.*(ones(8)*kval));  
%dekodér
for kk=1:1:k
    for ii=1:8:i
        for jj=1:8:j
            tmp2 = vstup(ii:ii+7,jj:jj+7,kk);
            tmp3 = tmp2.*sk_mat;
            dct_dequantized(ii:ii+7,jj:jj+7) = tmp3;
        end
    end
    %inverzní dct
    for ii=1:8:i
        for jj=1:8:j
            tmp3 = dct_dequantized(ii:ii+7,jj:jj+7);
            tmp4=id_mat*tmp3*d_mat;
            vystup(ii:ii+7,jj:jj+7,kk)=tmp4;
        end
    end
end
% decenterování dat kolem nuly (pro 16bit data odeèítám (2^16)/2 ~ 32768, pro 8bit by to bylo 256/2=128
bit=16; %bitová hloubka obrazové informace
%center_val=(2^bit)/2;
center_mat=(center_val*ones(i,j,k));
vystup=vystup+center_mat;
clear center_mat;
end

function [vystup,vektor_mat,prumer_exp]=klt_1d_komprese(vstup)
[i,j,k]=size(vstup);
m=1;
for ii=1:1:i %øádková segmentace
    for jj=1:1:j %sloupcová segmentace
            segment(1,:)=vstup(ii,jj,:);
            count=0;
            prumer=(1/k)*sum(segment(1,:));
            prumer_exp(ii,jj)=prumer;%pouze pro ucely exportu, uspora pameti
            prumer_mat=repmat(prumer,1,k);
            center=segment-prumer_mat;
            cov_mat=(1/k-1)*center*center';
            [vl_vektor,vl_cislo]=eig(cov_mat); 
            vektor_mat(ii,jj)=vl_vektor;
            tmp_komp=vl_vektor.*center;
            vystup(ii,jj,:)=tmp_komp(:,:);          
    end
end
end  

function [vystup]=klt_1d_dekomprese(vstup,vektor_mat,prumer_exp)
[i,j,k]=size(vstup);
m=1;
for ii=1:1:i %øádková segmentace
    for jj=1:1:j %sloupcová segmentace
            segment(1,:)=vstup(ii,jj,:);     
            vl_vektor=vektor_mat(ii,jj); %priprava postrannich dat
            prumer_mat=repmat(prumer_exp(ii,jj),1,k); %priprava postrannich dat           
            tmp_dekomp=vl_vektor.*segment;
            tmp_dekomp=tmp_dekomp+prumer_mat;   
            vystup(ii,jj,:)=tmp_dekomp(:,:);      
    end
end
end  
            
 function [vystup,vl_vektor]=klt_2d_komprese(vstup)
[i,j,k]=size(vstup);
m=1;
for kk=1:1:k
    for ii=1:8:i %øádková segmentace
        for jj=1:8:j %sloupcová segmentace
                segment=vstup(ii:ii+7,jj:jj+7,kk);
                index2=0;
                for index=1:8
                    tmp_exp_1d{index2+1}=segment(:,index)*segment(:,index)'; %naplnìní sloupci
                    index2=index2+1;
                end
                tmp_exp_2d=zeros(8:8); %vytvoøení predikèní matice 8x8
                for index=1:8
                    tmp_exp_2d=tmp_exp_2d+(1/8)*tmp_exp_1d{index};%predikce E[xx']
                end
                img_prum=zeros(8,1);
                for index=1:8
                    img_prum=img_prum+(1/8)*segment(:,index);
                end
                prum=img_prum*img_prum';
                cov=tmp_exp_2d - prum;
                [tmp_vektor{m},vl_cislo{m}]=eig(cov);
                temp=tmp_vektor{m};
                m=m+1;
                for index=1:8
                    tmp_vektor{m-1}(:,index)=temp(:,8-(index-1));
                end
                for index=1:8
                    trans_img1(:,index)=tmp_vektor{m-1}*segment(:,index);
                end
                vystup_tmp(ii:ii+7,jj:jj+7)=trans_img1(:,:);
        end
    end
    vl_vektor{1,kk}=tmp_vektor;
    vystup(:,:,kk)=vystup_tmp(:,:);
end
end

function [vystup]=klt_2d_dekomprese(vstup,vl_vektor)
ii=1;jj=1;
[i,j,k]=size(vstup);
m=1;
for kk=1:1:k
    tmp(:,:)=vstup(:,:,kk);
    tmp_vl_vektor=vl_vektor{1,kk};
    for ii=1:8:i %segmentace
        for jj=1:8:j
               segment=tmp(ii:ii+7,jj:jj+7);
               m=m+1;
               mask=ones(8,8); %maskovací jednotková matice - 8x8
               trans_img=segment.*mask;
               for l=1:8
               inv_trans_img(:,l)=tmp_vl_vektor{m-1}'*trans_img(:,l);
               end
               tmp_vystup(ii:ii+7,jj:jj+7)=inv_trans_img(:,:);
            end
    end
    vystup(:,:,kk)=tmp_vystup(:,:);
end
end


function [vystup,pca_vektory,pca_prumer_mat]=pca_2d_komprese(vstup,VV)
[i,j,k]=size(vstup); % dimenze vstupu
vystup=zeros(floor((VV/100)*i),j,k); %dimenze výstupu
%pca_prumer_mat=zeros(i,j,k); % dimenze výstupu
ii=1;jj=1;kk=1;index=1; %indexace
                for kk=1:1:k
                    tmp = vstup(:,:,kk);             
                    prumer=zeros(i,1);
                    for ii=1:1:i % výpoèet prùmìru každého øádku
                        prumer(ii,1)=(1/j)*sum(tmp(ii,:));
                    end        
                    prumer_mat=repmat(prumer,1,j); %definování matice prùmìrù (totožné sloupce)
                    pca_prumer_mat(:,:,kk)=prumer_mat;
                    % odeètení prùmìru od každého snímku - "centerování dat" 
                    center=tmp-prumer_mat;
                    % výpoèet kovarianèní matice
                    cov_mat=1/(j-1)*center*center';
                    % výpoèet vlastních hodnot a vlastních vektorù kovarianèní matice
                    [vl_vektor,vl_cislo]=eig(cov_mat); 
                    % rozøazení vlastních vektorù dle vlastních èísel (od nejvìtších)
                    vl_cislo = diag(vl_cislo);
                    [odpad, index] = sort(-vl_cislo);
                    clear odpad;
                    vl_cislo = vl_cislo(index);
                    vl_vektor = vl_vektor(:, index);
                    %výbìr vektorù (definování míry komprese)
                    vybrane_vektory=vl_vektor(:,1:(VV/100)*size(vl_vektor,2)); %% udává míru komprese
                    pca_vektory(:,:,kk)=vybrane_vektory; %pro úèely dekomprese
                    komp_snimek=vybrane_vektory'*double(center);
                    vystup(:,:,kk)=komp_snimek;
                end       
end

function [vystup]=pca_2d_dekomprese(pca_komp,orig,pca_vektory,pca_prumer_mat)
    [i,j,k]=size(orig); % dimenze puv. dat
    %[u,v,w]=size(pca_komp); % dimenze vstupu
    %vystup=zeros(i,j,k); % dimenze výstupu
    index=1;ii=1;jj=1;kk=1; % indexace
    % Rekonstrukce snímku
    for kk=1:1:k
        dek_snimek=pca_vektory(:,:,kk)*pca_komp(:,:,kk);
        dek_snimek=dek_snimek+pca_prumer_mat(:,:,kk);
        vystup(:,:,kk)=dek_snimek;
    end
end

function [xl_1,xh_1] = dwt_1d_coef(vstup,typ) % pùvodní verze, hodí se pro kombinování s interní matlab fcí dwt

string name;
        if (typ == 1) %Haar
            name = 'haar';
        elseif (typ == 2) %Daubechies 
            name = 'db3';
        elseif (typ == 3) %Symlets
            name = 'sym3';
        elseif (typ == 4) %Biorthogonal
            name = 'bior3.5';
        elseif (typ == 5) %Reverse Biorthogonal
            name = 'rbio3.5';
        elseif (typ == 6) %Coiflets
            name = 'coif3';   
        elseif (typ == 7) %Fejer-Korovkin filters
            name = 'fk4'; 
        end

[Lo_D,Hi_D]  = wfilters(name);  

delka_vstup = length(vstup);
delka_filtr = (length(Lo_D));             

delka_vstup = length(vstup);
vstup = [vstup(mod((-(delka_filtr-1):-1),delka_vstup)+1) vstup];          

xl_1 = conv(vstup,Lo_D);    xl_1 = xl_1(delka_filtr:2:(delka_filtr+delka_vstup-2));  
xh_1 = conv(vstup,Hi_D);   xh_1 = xh_1(delka_filtr:2:(delka_filtr+delka_vstup-2));
end


function [vystup] = idwt_1d_coef(xl_1,xh_1,typ) % pùvodní verze, hodí se pro kombinování s interní matlab fcí dwt

string name;
        if (typ == 1) %Haar
            name = 'haar';
        elseif (typ == 2) %Daubechies 
            name = 'db3';
        elseif (typ == 3) %Symlets
            name = 'sym3';
        elseif (typ == 4) %Biorthogonal
            name = 'bior3.5';
        elseif (typ == 5) %Reverse Biorthogonal
            name = 'rbio3.5';
        elseif (typ == 6) %Coiflets
            name = 'coif3';   
        elseif (typ == 7) %Fejer-Korovkin filters
            name = 'fk4'; 
        end
        
[Lo_D,Hi_D,Lo_R,Hi_R]  = wfilters(name);  

vstup=[xl_1,xh_1];

delka_vstup = length(vstup);   
delka_filtr = length(Lo_R);

stred_hod = delka_vstup/2;  
per  = mod(0:delka_filtr/2-1,stred_hod)+1;   

                       
xl_1_up(1:2:delka_vstup+delka_filtr) = [xl_1 xl_1(1,per)];                    

                     
xh_1_up(1:2:delka_vstup+delka_filtr) = [xh_1 xh_1(1,per)];              
       
konvoluce  = conv(xl_1_up,Lo_R) + conv(xh_1_up,Hi_R); 

vystup  = konvoluce(delka_filtr:delka_filtr+delka_vstup-1);     

end


function [vystup,delky]=dwt_komprese_manual(vstup,typ,uroven) %pozn. již nepoužívám, pomalé

string name;
        if (typ == 1) %Haar
            name = 'haar';
        elseif (typ == 2) %Daubechies 
            name = 'db3';
        elseif (typ == 3) %Symlets
            name = 'sym3';
        elseif (typ == 4) %Biorthogonal
            name = 'bior3.5';
        elseif (typ == 5) %Reverse Biorthogonal
            name = 'rbio3.5';
        elseif (typ == 6) %Coiflets
            name = 'coif3';   
        elseif (typ == 7) %Fejer-Korovkin filters
            name = 'fk4'; 
        end

[i,j,k]=size(vstup); %dimenze vstupu
%t = 0; %volba typu použité vlnky
%rad = úroveò dekompozice
%poznámka - výstupní matice dwt_komp nemá pøedem definovanou velikost - ta
%je závislá na typu použité vlnky i øádu
    for ii=1:i %rozložení matice do spekter jednotlivých pixelù
        for jj=1:j
            sig(1,:)=vstup(ii,jj,:);
            if (uroven==1)
                [xl_1 xh_1] = dwt(sig,name);
                vystup(ii,jj,:)=[xl_1 xh_1];
                if ii==1 && jj==1
                delky=[length(xl_1),length(xh_1)];
                end
            elseif (uroven==2)
                [xl_1 xh_1] = dwt(sig,name);
                [xl_2 xh_2] = dwt(xl_1,name);
                vystup(ii,jj,:)=[xl_2 xh_2 xh_1];
                if ii==1 && jj==1
                delky=[length(xl_2),length(xh_2),length(xh_1)];
                end
            elseif (uroven==3)
                [xl_1 xh_1] = dwt(sig,name);
                [xl_2 xh_2] = dwt(xl_1,name);
                [xl_3 xh_3] = dwt(xl_2,name);
                vystup(ii,jj,:)=[xl_3 xh_3 xh_2 xh_1];
                if ii==1 && jj==1
                delky=[length(xl_3),length(xh_3),length(xh_2),length(xh_1)];
                end
            elseif (uroven==4)
                [xl_1 xh_1] = dwt(sig,name);
                [xl_2 xh_2] = dwt(xl_1,name);
                [xl_3 xh_3] = dwt(xl_2,name);
                [xl_4 xh_4] = dwt(xl_3,name);
                vystup(ii,jj,:)=[xl_4 xh_4 xh_3 xh_2 xh_1];
                if ii==1 && jj==1
                delky=[length(xl_4),length(xh_4),length(xh_3),length(xh_2),length(xh_1)];
                end
            elseif (uroven==5)
                [xl_1 xh_1] = dwt(sig,name);
                [xl_2 xh_2] = dwt(xl_1,name);
                [xl_3 xh_3] = dwt(xl_2,name);
                [xl_4 xh_4] = dwt(xl_3,name);
                [xl_5 xh_5] = dwt(xl_4,name);
                vystup(ii,jj,:)=[xl_5 xh_5 xh_4 xh_3 xh_2 xh_1];
                if ii==1 && jj==1
                delky=[length(xl_5),length(xh_5),length(xh_4),length(xh_3),length(xh_2),length(xh_1)];
                end
            elseif (uroven==6)
                [xl_1 xh_1] = dwt(sig,name);
                [xl_2 xh_2] = dwt(xl_1,name);
                [xl_3 xh_3] = dwt(xl_2,name);
                [xl_4 xh_4] = dwt(xl_3,name);
                [xl_5 xh_5] = dwt(xl_4,name);
                [xl_6 xh_6] = dwt(xl_5,name);
                vystup(ii,jj,:)=[xl_6 xh_6 xh_5 xh_4 xh_3 xh_2 xh_1];
                if ii==1 && jj==1
                delky=[length(xl_6),length(xh_6),length(xh_5),length(xh_4),length(xh_3),length(xh_2),length(xh_1)];
                end
              elseif (uroven==7)
                [xl_1 xh_1] = dwt(sig,name);
                [xl_2 xh_2] = dwt(xl_1,name);
                [xl_3 xh_3] = dwt(xl_2,name);
                [xl_4 xh_4] = dwt(xl_3,name);
                [xl_5 xh_5] = dwt(xl_4,name);
                [xl_6 xh_6] = dwt(xl_5,name);
                [xl_7 xh_7] = dwt(xl_6,name);
                vystup(ii,jj,:)=[xl_7 xh_7 xh_6 xh_5 xh_4 xh_3 xh_2 xh_1];   
                if ii==1 && jj==1
                delky=[length(xl_7),length(xh_7),length(xh_6),length(xh_5),length(xh_4),length(xh_3),length(xh_2),length(xh_1)];
                end
            else
                [xl_1 xh_1] = dwt(sig,name);
                vystup(ii,jj,:)=[xl_1 xh_1];
            end       
        end
    end
end

function [vystup]=dwt_dekomprese_manual(vstup,typ,uroven,delky) %pozn. již nepoužívám, pomalé

[i,j,k]=size(vstup); %dimenze vstupu


string name;
        if (typ == 1) %Haar
            name = 'haar';
        elseif (typ == 2) %Daubechies 
            name = 'db3';
        elseif (typ == 3) %Symlets
            name = 'sym3';
        elseif (typ == 4) %Biorthogonal
            name = 'bior3.5';
        elseif (typ == 5) %Reverse Biorthogonal
            name = 'rbio3.5';
        elseif (typ == 6) %Coiflets
            name = 'coif3';   
        elseif (typ == 7) %Fejer-Korovkin filters
            name = 'fk4'; 
        end

        if (uroven == 7)     %[xl_7 xh_7 xh_6 xh_5 xh_4 xh_3 xh_2 xh_1]
            wl_7=delky(1,1);wh_7=delky(1,2);wh_6=delky(1,3);
            wh_5=delky(1,4);wh_4=delky(1,5);wh_3=delky(1,6);
            wh_2=delky(1,7);wh_1=delky(1,8);
        elseif (uroven == 6) %[xl_6 xh_6 xh_5 xh_4 xh_3 xh_2 xh_1]
            wl_6=delky(1,1);wh_6=delky(1,2);wh_5=delky(1,3);
            wh_4=delky(1,4);wh_3=delky(1,5);wh_2=delky(1,6);
            wh_1=delky(1,7);
        elseif (uroven == 5) %[xl_5 xh_5 xh_4 xh_3 xh_2 xh_1];  
            wl_5=delky(1,1);wh_5=delky(1,2);wh_4=delky(1,3);
            wh_3=delky(1,4);wh_2=delky(1,5);wh_1=delky(1,6);
        elseif (uroven == 4) %[xl_4 xh_4 xh_3 xh_2 xh_1]
            wl_4=delky(1,1);wh_4=delky(1,2);wh_3=delky(1,3);
            wh_2=delky(1,4);wh_1=delky(1,5);
        elseif (uroven == 3) %[x1_3 xh_3 xh_2 xh_1]
            wl_3=delky(1,1);wh_3=delky(1,2);wh_2=delky(1,3);
            wh_1=delky(1,4);
        elseif (uroven == 2) %[xl_2 xh_2 xh_1]
            wl_2=delky(1,1);wh_2=delky(1,2);wh_1=delky(1,3);
        elseif (uroven == 1) %[xl_1 xh_1]
            wl_1=delky(1,1);wh_1=delky(1,2);
        end

    for ii=1:i %rozložení matice do spekter jednotlivých pixelù
        for jj=1:j
            sig(1,:)=vstup(ii,jj,:);
                      
            if (uroven==7) %[xl_7 xh_7 xh_6 xh_5 xh_4 xh_3 xh_2 xh_1]  
            xl_7=sig(1:wl_7);
            xh_7=sig(wl_7+1:wl_7+wh_7);
                
            xl_6=idwt(xl_7,xh_7,name,wh_6); 
            xh_6=sig(wl_7+wh_7+1:wl_7+wh_7+wh_6);
                
            xl_5=idwt(xl_6,xh_6,name,wh_5); 
            xh_5=sig(wl_7+wh_7+wh_6+1:wl_7+wh_7+wh_6+wh_5);
                
            xl_4=idwt(xl_5,xh_5,name,wh_4); 
            xh_4=sig(wl_7+wh_7+wh_6+wh_5+1:wl_7+wh_7+wh_6+wh_5+wh_4);
                
            xl_3=idwt(xl_4,xh_4,name,wh_3); 
            xh_3=sig(wl_7+wh_7+wh_6+wh_5+wh_4+1:wl_7+wh_7+wh_6+wh_5+wh_4+wh_3);
           
            xl_2=idwt(xl_3,xh_3,name,wh_2);
            xh_2=sig(wl_7+wh_7+wh_6+wh_5+wh_4+wh_3+1:wl_7+wh_7+wh_6+wh_5+wh_4+wh_3+wh_2); 
            
            xl_1=idwt(xl_2,xh_2,name,wh_1);
            xh_1=sig(wl_7+wh_7+wh_6+wh_5+wh_4+wh_3+wh_2+1:k);        
            end 
            
            if (uroven==6) %[xl_6 xh_6 xh_5 xh_4 xh_3 xh_2 xh_1]  
            xl_6=sig(1:wl_6);
            xh_6=sig(wl_6+1:wl_6+wh_6);
                
            xl_5=idwt(xl_6,xh_6,name,wh_5); 
            xh_5=sig(wl_6+wh_6+1:wl_6+wh_6+wh_5);
                
            xl_4=idwt(xl_5,xh_5,name,wh_4); 
            xh_4=sig(wl_6+wh_6+wh_5+1:wl_6+wh_6+wh_5+wh_4);
                
            xl_3=idwt(xl_4,xh_4,name,wh_3); 
            xh_3=sig(wl_6+wh_6+wh_5+wh_4+1:wl_6+wh_6+wh_5+wh_4+wh_3);
           
            xl_2=idwt(xl_3,xh_3,name,wh_2);
            xh_2=sig(wl_6+wh_6+wh_5+wh_4+wh_3+1:wl_6+wh_6+wh_5+wh_4+wh_3+wh_2); 
            
            xl_1=idwt(xl_2,xh_2,name,wh_1);
            xh_1=sig(wl_6+wh_6+wh_5+wh_4+wh_3+wh_2+1:k);        
            end      
            
            if (uroven==5) %[xl_5 xh_5 xh_4 xh_3 xh_2 xh_1];   
            xl_5=sig(1:wl_5);
            xh_5=sig(wl_5+1:wl_5+wh_5);
                
            xl_4=idwt(xl_5,xh_5,name,wh_4); 
            xh_4=sig(wl_5+wh_5+1:wl_5+wh_5+wh_4);
                
            xl_3=idwt(xl_4,xh_4,name,wh_3); 
            xh_3=sig(wl_5+wh_5+wh_4+1:wl_5+wh_5+wh_4+wh_3);
           
            xl_2=idwt(xl_3,xh_3,name,wh_2);
            xh_2=sig(wl_5+wh_5+wh_4+wh_3+1:wl_5+wh_5+wh_4+wh_3+wh_2); 
            
            xl_1=idwt(xl_2,xh_2,name,wh_1);
            xh_1=sig(wl_5+wh_5+wh_4+wh_3+wh_2+1:k);        
            end 
            
            
            if (uroven==4) %[xl_4 xh_4 xh_3 xh_2 xh_1]
            xl_4=sig(1:wl_4);
            xh_4=sig(wl_4+1:wl_4+wh_4);
                
            xl_3=idwt(xl_4,xh_4,name,wh_3); 
            xh_3=sig(wl_4+wh_4+1:wl_4+wh_4+wh_3);
           
            xl_2=idwt(xl_3,xh_3,name,wh_2);
            xh_2=sig(wl_4+wh_4+wh_3+1:wl_4+wh_4+wh_3+wh_2);
            
            xl_1=idwt(xl_2,xh_2,name,wh_1);
            xh_1=sig(wl_4+wh_4+wh_3+wh_2+1:k);           
            end            
           
            
            if (uroven==3) %[x1_3 xh_3 xh_2 xh_1]
            xl_3=sig(1:wl_3);
            xh_3=sig(wl_3+1:wl_3+wh_3);
           
            xl_2=idwt(xl_3,xh_3,name,wh_2);
            xh_2=sig(wl_3+wh_3+1:wl_3+wh_3+wh_2);
            
            xl_1=idwt(xl_2,xh_2,name,wh_1);
            xh_1=sig(wl_3+wh_3+wh_2+1:k);         
            end
            
            if (uroven==2) %[xl_2 xh_2 xh_1]
            xl_2=sig(1:wh_2); %aviris 1-68
            xh_2=sig(wl_2+1:wl_2+wh_2); % aviris 69-136 

            xl_1=idwt(xl_2,xh_2,name,wh_1);
            xh_1=sig(wl_2+wh_2+1:k); %137-256 (delka 240/2)
            end
            
            if (uroven==1) 
            xl_1=sig(1:k/2); 
            xh_1=sig(k/2+1:k); 
            end
            
            rek=idwt(xl_1,xh_1,name); 
            vystup(ii,jj,:) = rek;  
            
        end
    end
end


%__________________________________________________
% Analýza - zanesení šumu do hyperspektrálních dat
%__________________________________________________

function sum_matice=sum_gauss(vstup)
    [radky_o,sloupce_o,spektra_o]=size(vstup);
    sum_matice=zeros(radky_o,sloupce_o,spektra_o);
    for o=1:1:spektra_o
        orig_o=vstup(:,:,o);
        sum_matice(:,:,o)=imnoise(orig_o, 'gaussian');
    end
end

function sum_matice=sum_saltpepper(vstup)
    [radky_o,sloupce_o,spektra_o]=size(vstup);
    sum_matice=zeros(radky_o,sloupce_o,spektra_o);
    for o=1:1:spektra_o
        orig_o=vstup(:,:,o);
        sum_matice(:,:,o)=imnoise(orig_o, 'salt & pepper');
    end
end

function sum_matice=sum_speckle(vstup)
    [radky_o,sloupce_o,spektra_o]=size(vstup);
    sum_matice=zeros(radky_o,sloupce_o,spektra_o);
    for o=1:1:spektra_o
        orig_o=vstup(:,:,o);
        sum_matice(:,:,o)=imnoise(orig_o, 'speckle');
    end
end

function sum_matice=sum_localvar(vstup)
    [radky_o,sloupce_o,spektra_o]=size(vstup);
    sum_matice=zeros(radky_o,sloupce_o,spektra_o);
    for o=1:1:spektra_o
        orig_o=vstup(:,:,o);
        sum_matice(:,:,o)=imnoise(orig_o, 'localvar');
    end
end

function sum_matice=sum_poisson(vstup)
    [radky_o,sloupce_o,spektra_o]=size(vstup);
    sum_matice=zeros(radky_o,sloupce_o,spektra_o);
    for o=1:1:spektra_o
        orig_o=vstup(:,:,o);
        sum_matice(:,:,o)=imnoise(orig_o, 'poisson');
    end
end

%__________________________________________________
% Analýza - ekvalizace, kombinování kanálù atp.
%__________________________________________________

function [vystup]=ekvalizace(vstup,mini)
[i,j,k]=size(vstup);
ii=1;jj=1;kk=1;
vystup=zeros(i,j,k);
    if mini<0
                for kk=1:1:k
                    ii=1;
                    for ii=1:1:i
                        jj=1;
                        for jj=1:1:j
                            vystup(ii,jj,kk)=(vstup(ii,jj,kk)+abs(mini));
                            if vystup(ii,jj,kk)>65536
                               vystup(ii,jj,kk)=65536;
                            end
                        end
                    end
                end
    end
end

function vystup = adpt_ekv(vstup)
    [i,j,k]=size(vstup);
    kk=1;
    tmp=zeros(i,j);
    vystup=zeros(i,j,k);
    for kk=1:1:k
        tmp(:,:)=vstup(:,:,kk);
        tmp=adapthisteq(tmp,'ClipLimit',0.1);
        vystup(:,:,kk)=tmp(:,:);
    end 
    
end

function [RGB_img] = combine_rgb(r,g,b)
    limity(1,:)=[min(min(r)),max(max(r))];
    limity(2,:)=[min(min(g)),max(max(g))];
    limity(3,:)=[min(min(b)),max(max(b))];
    RGB_img=cat(3,r,g,b);
    matice_i=zeros(size(r));
for n=1:3
    matice_i=RGB_img(:,:,n);
    matice_i(matice_i<=limity(n,1))=limity(n,1);
    matice_i(matice_i>=limity(n,2))=limity(n,2);
    matice_i=matice_i-limity(n,1);
    matice_i=matice_i./(limity(n,2)-limity(n,1));
    RGB_img(:,:,n)=matice_i;
end 
end

%__________________________________________________
% Analýza - doplòkové výpoèty
%__________________________________________________

function [maximum]=max_hodnota(vstup)
    [i,j,k]=size(vstup);
    ii=1;jj=1;kk=1;
    maximum=vstup(ii,jj,kk);
        for kk=1:1:k
            ii=1;
            for ii=1:1:i
                jj=1;
                for jj=1:1:j
                    if vstup(ii,jj,kk)>=maximum
                       maximum=vstup(ii,jj,kk);                     
                    end
                end
            end
        end
end

function [minimum]=min_hodnota(vstup)
    [i,j,k]=size(vstup);
    ii=1;jj=1;kk=1;
    minimum=vstup(ii,jj,kk);
        for kk=1:1:k
            ii=1;
            for ii=1:1:i
                jj=1;
                for jj=1:1:j
                    if vstup(ii,jj,kk)<=minimum
                       minimum=vstup(ii,jj,kk);                     
                    end
                end
            end
        end
end   

%__________________________________________________
% Analýza - výpoèet parametrù komprese
%__________________________________________________

function [vystup]=norm_krizova_korelace3D(vstup)
[i,j,k]=size(vstup); %dimenze vsutpu
l=k; %druhé porovnáváné pásmo
for ll=1:1:l             %pásmo 2
	for kk=1:1:k         %pásmo 1
        
        tmp_k(:,:)=vstup(:,:,kk); %matice øezu pásma k 
        tmp_l(:,:)=vstup(:,:,ll); %matice øezu pásma k

        Di_k_p=(sum(sum(tmp_k)))/(i*j); %prùmìrná hodnota intenzity pixelù pásma k
        Di_l_p=(sum(sum(tmp_l)))/(i*j); %prùmìrná hodnota intenzity pixelù pásma l
        
        sum_citatel=0;sum_jmenovatel_r=0;sum_jmenovatel_l=0; %vynulování sum
        
		for ii=1:1:i     %øádek
			for jj=1:1:j %sloupec
            
            Di_k=vstup(ii,jj,kk); %aktuální hodnota pixelu [i,j] v pásmu k
            Di_l=vstup(ii,jj,ll); %aktuální hodnota pixelu [i,j] v pásmu l
                
			citatel=(Di_k-Di_k_p)*(Di_l-Di_l_p); %pomocné výpoèty
			sum_citatel=sum_citatel+citatel;

			jmenovatel_l=(Di_k-Di_k_p)^2;
			sum_jmenovatel_l=sum_jmenovatel_l+jmenovatel_l;
			jmenovatel_r=(Di_l-Di_l_p)^2;
			sum_jmenovatel_r=sum_jmenovatel_r+jmenovatel_r;
            
                if ii==i && jj==j %poslední øádek a sloupec v aktuálním pásmu, spustit hlavní výpoèet
                    vystup(kk,ll)=sum_citatel/((sqrt(sum_jmenovatel_l)*sqrt(sum_jmenovatel_r))); %hlavní výpoèet NCC
                end
            end
        end	  
    end
end
end


function [MSE,RMSE,MSE_matice]=MSE_vypocet(puvodni,upraveny)
[i,j,k]=size(puvodni);
MSE_matice=zeros(i,j,k);
kk=1;
MSE_u=zeros(i,j);
    for kk=1:1:k
        orig_u=puvodni(:,:,kk);
        noise_u=upraveny(:,:,kk);
        MSE_u=(orig_u-noise_u).^2;
        MSE_matice(:,:,kk)=MSE_u;
    end
SUM_MSE=sum(sum(sum(MSE_matice))); %seètení prvkù MSE matice (pro každý rozmìr jedna suma)
MSE=SUM_MSE/(i*j*k);
RMSE=sqrt(MSE/numel(MSE_matice)); %výpoèet RMSE
end

function [vystup]=objem_dat(vstup)
    [i,j,k]=size(vstup);
    poc_pix=i*j*k;
    bit_hloubka=16;
    objem=poc_pix*bit_hloubka;
    cil_jedn=2; %cílová jednotka velikosti 1=kB,2=MB,3=GB,4=TB
    vystup=(objem/8)/(1024^cil_jedn);
end

function vystup=kompresni_pomer(puvodni,upraveny)
    vystup=(100-(numel(upraveny)/numel(puvodni)));
end

function [MSE_2D,RMSE_2D]=MSE_vypocet_2D(puvodni, upraveny)
[i,j]=size(puvodni);

MSE_matice_2D=zeros(i,j);
MSE_matice_2D=(puvodni-upraveny).^2;

SUM_MSE_2D=(sum(MSE_matice_2D)); %seètení prvkù MSE matice (pro každý rozmìr jedna suma)
MSE_2D=SUM_MSE_2D/(i*j);
RMSE_2D=sqrt(MSE_2D/numel(MSE_matice_2D)); %výpoèet RMSE
end

function [PSNR,maximum]=PSNR_vypocet(puvodni, upraveny, MSE)
    max_upr=max_hodnota(upraveny);
    max_puv=max_hodnota(puvodni);
    if max_puv>max_upr
        maximum=max_puv;
    else
        maximum=max_upr;
    end
    PSNR=20*log10(maximum/MSE);
end

function [vystup,entropie_tmp]=entropie(vstup)

[vstup_rad]=matice_do_radku(vstup); %pro zjednodušení výpoètu (ménì cyklù)
[i,j] = size(vstup_rad);

unikatni_hodnoty=unique(vstup_rad); %sestavení slovníku
len_unik_hod=length(unikatni_hodnoty);
pocet=hist(vstup_rad,unikatni_hodnoty); %èetnost jednotlivých hodnot

for jj=1:1:j
    for index=1:1:len_unik_hod
        if vstup_rad(1,jj)==unikatni_hodnoty(1,index)
            cetnost=pocet(1,index);
            pst=cetnost/j; %pravdìpodobnost hodnoty na pozici jj
            entropie_tmp(1,index)=(pst*log2(pst)); %samotný výpoèet entropie hodnoty jj
            break;
        end
    end
end
vystup=-sum(entropie_tmp); %suma - entropie pro celou matici
end

%__________________________________________________
% Analýza - pøeformátování matice
%__________________________________________________

function [vystup]=zig_zag_seg8(vstup)
[i,j,k]=size(vstup); %dimenze vstupu
vystup=zeros(1,i*j); %dimenze výstupu
ii=1;jj=1;kk=1; index=1; %indexace

        for kk=1:1:k
        ii=1;jj=1;
            for ii=1:8:i
            for jj=1:8:j
                segment=vstup(ii:ii+7,jj:jj+7,kk);
                [u,v]=size(segment);
                uu=1;vv=1; 
                while uu<=u && vv<=v
                    if uu==1 && mod(uu+vv,2)==0 && vv~=v
                        vystup(index)=segment(uu,vv);
                        vv=vv+1;							%nahoøe postup doprava
                        index=index+1;
                    elseif uu==u && mod(uu+vv,2)~=0 && vv~=v
                        vystup(index)=segment(uu,vv);
                        vv=vv+1;							%pole postup doprava
                        index=index+1;
                    elseif vv==1 && mod(uu+vv,2)~=0 && uu~=u
                        vystup(index)=segment(uu,vv);
                        uu=uu+1;							%vlevo postup dolu
                        index=index+1;
                    elseif vv==v && mod(uu+vv,2)==0 && uu~=u
                        vystup(index)=segment(uu,vv);
                        uu=uu+1;							%vpravo postup dolu
                        index=index+1;
                    elseif vv~=1 && uu~=u && mod(uu+vv,2)~=0
                        vystup(index)=segment(uu,vv);
                        uu=uu+1;		vv=vv-1;	%diagonální postup doleva dolù
                        index=index+1;
                    elseif uu~=1 && vv~=v && mod(uu+vv,2)==0
                        vystup(index)=segment(uu,vv);
                        uu=uu-1;		vv=vv+1;	%diagonální postup doprava nahoru
                        index=index+1;
                    elseif uu==u && vv==v	%získání posledního elementu aktuálnígo segmentu
                        vystup(index)=segment(uu,vv);
                        index=index+1;
                        break
                    end
                end
            end
            end
        end
end

function [vystup]=inv_zig_zag_seg8(vstup,puvodni_data)
[i,j,k]=size(puvodni_data); %dimenze výstupu
delka_radku=length(vstup);
delka_segmentu=64;
delka_snimku=i*j;
ii=1;jj=1;kk=1;index_seg=1;seg=1;indx=1;uu=1;vv=1;poradi_segm=0;dalsi_spektrum=(i/8)*(j/8);

for seg=1:delka_segmentu:delka_radku
    segment=vstup(seg:seg+delka_segmentu-1);
    poradi_segm=poradi_segm+1;
    u=8;v=8;uu=1;vv=1;index_seg=1;
                while index_seg<=delka_segmentu
                    if uu==1 && mod(uu+vv,2)==0 && vv~=v
                        tmp(uu,vv)=segment(index_seg);
                        vv=vv+1;							%nahoøe postup doprava
                        index_seg=index_seg+1;
                    elseif uu==u && mod(uu+vv,2)~=0 && vv~=v
                        tmp(uu,vv)=segment(index_seg);
                        vv=vv+1;							%pole postup doprava
                        index_seg=index_seg+1;
                    elseif vv==1 && mod(uu+vv,2)~=0 && uu~=u
                        tmp(uu,vv)=segment(index_seg);
                        uu=uu+1;							%vlevo postup dolu
                        index_seg=index_seg+1;
                    elseif vv==v && mod(uu+vv,2)==0 && uu~=u
                        tmp(uu,vv)=segment(index_seg);
                        uu=uu+1;							%vpravo postup dolu
                        index_seg=index_seg+1;
                    elseif vv~=1 && uu~=u && mod(uu+vv,2)~=0
                        tmp(uu,vv)=segment(index_seg);
                        uu=uu+1;		vv=vv-1;	%diagonální postup doleva dolù
                        index_seg=index_seg+1;
                    elseif uu~=1 && vv~=v && mod(uu+vv,2)==0
                        tmp(uu,vv)=segment(index_seg);
                        uu=uu-1;		vv=vv+1;	%diagonální postup doprava nahoru
                        index_seg=index_seg+1;
                    elseif uu==u && vv==v	%získání posledního elementu aktuálnígo segmentu
                        tmp(uu,vv)=segment(index_seg);
                        vystup(ii:ii+7,jj:jj+7,kk)=tmp(:,:);
                        index_seg=index_seg+1;
                        jj=jj+8;
                        if jj==j+1 
                            jj=1; ii=ii+8;
                        end
                        if poradi_segm==dalsi_spektrum
                            poradi_segm=0;
                            kk=kk+1;ii=1;jj=1;
                        end
                    end
                    end
                end
end



function [vystup]=zig_zag(vstup)
[i,j,k]=size(vstup); %dimenze vstupu
vystup=zeros(1,i*j); %dimenze výstupu
ii=1;jj=1;kk=1; index=1; %indexace

        for kk=1:1:k
        ii=1;jj=1;
                while ii<=i && jj<=j
                    if ii==1 && mod(ii+jj,2)==0 && jj~=j
                        vystup(index)=vstup(ii,jj,kk);
                        jj=jj+1;							%nahoøe postup doprava
                        index=index+1;
                    elseif ii==i && mod(ii+jj,2)~=0 && jj~=j
                        vystup(index)=vstup(ii,jj,kk);
                        jj=jj+1;							%pole postup doprava
                        index=index+1;
                    elseif jj==1 && mod(ii+jj,2)~=0 && ii~=i
                        vystup(index)=vstup(ii,jj,kk);
                        ii=ii+1;							%vlevo postup dolu
                        index=index+1;
                    elseif jj==j && mod(ii+jj,2)==0 && ii~=i
                        vystup(index)=vstup(ii,jj,kk);
                        ii=ii+1;							%vpravo postup dolu
                        index=index+1;
                    elseif jj~=1 && ii~=i && mod(ii+jj,2)~=0
                        vystup(index)=vstup(ii,jj,kk);
                        ii=ii+1;		jj=jj-1;	%diagonální postup doleva dolù
                        index=index+1;
                    elseif ii~=1 && jj~=j && mod(ii+jj,2)==0
                        vystup(index)=vstup(ii,jj,kk);
                        ii=ii-1;		jj=jj+1;	%diagonální postup doprava nahoru
                        index=index+1;
                    elseif ii==i && jj==j	%získání posledního elementu aktuální vlnové délky
                        vystup(index)=vstup(ii,jj,kk);
                        index=index+1;
                        break
                    end
                end
        end
end

function [vystup]=inv_zig_zag(vstup,puvodni_data)
[i,j,k]=size(puvodni_data); %dimenze výstupu
delka_radku=length(vstup);
sub_delka_radku=i*j; %délka øádku pro jeden snímek vlnové délky
vystup=zeros(i,j); %dimenze výstupu
ii=1;jj=1;kk=1;index=1;

        while index<=delka_radku
            if ii==1 && mod(ii+jj,2)==0 && jj~=j
                vystup(ii,jj,kk)=vstup(index);
                jj=jj+1;							%nahoøe postup vpravo
                index=index+1;

            elseif ii==i && mod(ii+jj,2)~=0 && jj~=j
                vystup(ii,jj,kk)=vstup(index);
                jj=jj+1;							%dole postup vpravo
                index=index+1;

            elseif jj==1 && mod(ii+jj,2)~=0 && ii~=i
                vystup(ii,jj,kk)=vstup(index);
                ii=ii+1;							%vlevo postup dolu
                index=index+1;

            elseif jj==j && mod(ii+jj,2)==0 && ii~=i
                vystup(ii,jj,kk)=vstup(index);
                ii=ii+1;							%vpravo postup dolu
                index=index+1;

            elseif jj~=1 && ii~=i && mod(ii+jj,2)~=0
                vystup(ii,jj,kk)=vstup(index);
                ii=ii+1;		jj=jj-1;	%diagonální postup vlevo dolu
                index=index+1;

            elseif ii~=1 && jj~=j && mod(ii+jj,2)==0
                vystup(ii,jj,kk)=vstup(index);
                ii=ii-1;		jj=jj+1;	%diagonální postup vpravo nahoru
                index=index+1;

            elseif index==(kk*sub_delka_radku)			%poslední element aktuální vlnové délky
                vystup(ii,jj,kk)=vstup(index);
                if kk==k
                    break
                end
                ii=1;jj=1;kk=kk+1;
                index=index+1;
            end
        end
end

function [vystup]=matice_do_radku(vstup)
    [i,j,k]=size(vstup); %dimenze vstupu
    ii=1;jj=1;kk=1; %indexace
    index=1;
    velikost=i*j*k;
    vystup=zeros(1,velikost); %dimenze výstupu
        for kk=1:1:k
            ii=1;
            for ii=1:1:i
                jj=1;
                for jj=1:1:j
                    vystup(index)=vstup(ii,jj,kk);
                    index=index+1;
                end
            end
        end
end

function [vystup]=radek_do_matice(vstup,puvodni_data)
    [i,j,k]=size(puvodni_data); %dimenze výstupu
    vystup=zeros(i,j,k); %dimenze výstupu
    ii=1;jj=1;kk=1; %indexace
    index=1;
        for kk=1:1:k
            ii=1;
            for ii=1:1:i
                jj=1;
                for jj=1:1:j
                    vystup(ii,jj,kk)=vstup(index);
                    index=index+1;
                end
            end
        end
end

function [vystup]=matice_do_radku_dim(vstup)
    [i,j,k]=size(vstup);
    ii=1;jj=1;kk=1; %indexace
    index=1;
    velikost=i*j*k;
    vystup=zeros(1,velikost); %dimenze výstupu
        for kk=1:1:k
            ii=1;
            for ii=1:1:i
                jj=1;
                for jj=1:1:j
                    vystup(index)=vstup(ii,jj,kk);
                    index=index+1;
                end
            end
        end
end

function [vystup]=radek_do_matice_dim(vstup,i,j,k)
    vystup=zeros(i,j,k); %dimenze výstupu
    ii=1;jj=1;kk=1; %indexace
    index=1;
        for kk=1:1:k
            ii=1;
            for ii=1:1:i
                jj=1;
                for jj=1:1:j
                    vystup(ii,jj,kk)=vstup(index);
                    index=index+1;
                end
            end
        end
end

function vystup=inverze_vektoru(vstup)
[i,j]=size(vstup);
vystup=zeros(1,j);
for index=1:1:j
    vystup(1,(j+1-index))=vstup(1,index);
end
end


