function [output,coef,ocoef] = TETROLET(img)

%% transformační metoda Tetrolet
% VSTUP: im - originalni obraz
%        cfs - volba poctu koeficientu 
%       
%        J - pocet urovni dekompozice
%        num_cov - pocet vyuzitych tetrominu
%
% OUTPUT: rekonstruovany obraz

%   Funkce v zaveru i urci hodnoty kvality obrazu jako jsou SNR,PSNR,MSE a
%   SSIM.
%
%   Obecny tvar funkce:
%   [OUTPUT,COEF,OCOEF]  = TETROLET(IM,CFS)
%
%   Vstupem se zadava primo nazev souboru.
%
%   Priklad zadavani funkce:
%   [output,coef,ocoef] = TETROLET('lena.png',4000);

%% Nacteni vstupníhi obraz:
im = imread(img);
im = double(im);
im = im(:,:,1); % omezeni na jednu hladina v pripade barevneho obrazku
a=im;
%% vstupní parametry
 cfs=256;                             %počet koeficientů
J = 5;% log2(size(a,1))-1;              % level
num_cov = 117;                     


global COV_DISTRIB


%% dekompozice
b1 = dec_tetro(a,J,num_cov)
%% funkce pro omezeni koeficientu
ocoef = thresh_cell(b1,cfs)
%% rekonstrukce
outputTetro = rec_tetro(cfs); trec = toc;
%% dekompozice pro filtr 9/7
tic; coef = waveletcdf97(a, J+1);
tdec=toc;
%% koeficienty
[c3,N3] = thresh_matrix(coef, J+1, cfs);
%% rekonstrukce
tic; output = waveletcdf97(c3, -(J+1)); trec=toc;


disp(['Transformace pro ',num2str(cfs),' koeficientu metody tetrolet']);
disp(' ');


%% výpočet parametrů PSNR,SNR,MSE,SSIM
xx = double(a)/256; %% xx - Vstupni hodnoty
xhat1 = (double(output)/256); %% xhat1 - Vystupni hodnoty
error = mean(mean(((xx)-(xhat1)).^2));  %MSE
err = xx - xhat1;
err = err(:);
PSNRdb = 10 * log10(1/mean(err .^2));   %PSNR
ssm = ssim(a,output);

snr = 10 * log10(var(xx(:), 1) / mean(err(:).^2)); %SNR

disp(['PSNR = ',num2str(PSNRdb),'dB']);
disp(['SNR  = ',num2str(snr),'dB']);
disp(['MSE  = ',num2str(error)]);
disp(['SSIM = ',num2str(ssm)]);

output=uint8(output);
%imagesc(output),colormap(gray), axis image off