function [output,coef,ocoef] = DenoiseSURELET(img,cfs)
%transformační metoda SURELET

%   ziska pro vstupni obraz im vystup output, ktery je s omezenym poctem
%   nejvyznamnejsich koeficientu. Ty jsou zadany pod hodnotou cfs.
%   Z možných vystupnich hodnot je na vyber výsledná rekonstrukce obrazu z
%   daneho poctu koeficientu, vypoctene koeficienty ze vstupniho obrazu a
%   omezene koeficienty.
%
%   Funkce v zaveru i urci hodnoty kvality obrazu jako jsou SNR,PSNR,MSE a
%   SSIM.
%
%   Obecny tvar funkce:
%   [OUTPUT,COEF,OCOEF]  = DenoiseSURELET(IM,CFS)
%   
%      
%   Vstupem se zadava primo nazev souboru.
%
%   Priklad zadavani funkce:
%   [output,coef,ocoef] = DenoiseSURELET('lena.png',4000);


%% Načtení vstupního obrazu

im = double(imread(img));
im = im(:,:,1); % omezeni na jednu hladinu v pripade barevneho obrazku

%% vstupni parametry
sigma = 20;             % hodnota standardu zasumeni
wtype = 'sym8';         % typ orthonormální filtru

%% Vytvoření vstupního zašuměného obrazu
randn('state',0);
noise = randn(size(im));
noise = noise/std(noise(:));
im_noise = im+sigma*noise;        

%% Proces odšumění
output = OWT_SURELET_denoise(im_noise,wtype,sigma,cfs);    

%% Vypocty PSNR, SNR, MSE a SSIM 

vst = double(im_noise)/256; %%  vstupni hodnoty
vys = (double(output)/256); %%  ystupni hodnoty
chyb = mean(mean(((vst)-(vys)).^2));  % vypocet stredni kvadraticke chyby MSE
chyba = vst - vys;
chyba = chyba(:);
PSNR = 10 * log10(1/mean(chyba .^2));   % vypocet spockoveho pomeru signal-sum: PSNR
ssimm = ssim(im_noise, output);               
SNR = 10 * log10(var(vst(:), 1) / mean(chyba(:).^2));

%% Zobrazení vypoctenych vystupnich parametru na displej
disp(['Transformace pro ',num2str(cfs),' koeficientu metody Surelet']);

disp(' ');

disp(['PSNR = ',num2str(PSNR),'dB']);
disp(['SNR  = ',num2str(SNR),'dB']);
disp(['MSE  = ',num2str(chyb)]);
disp(['SSIM = ',num2str(abs(ssimm))]);

%%vykresleni vysptuniho obrazu

imagesc(output,[0 255]);axis image off;colormap gray(256);

output=uint8(output);