clc;
clear all;

%Fourierova transformace
 
% funkce pro zobrazeni baze jednoho zvoleneho koeficientu 

%Volba počtu koeficientů
cfs=8192;

im = zeros(256,256); %vytvireni prazdneho obrazu o rozmerech 256x256 bodu

% Výpočet koeficientu pomocí fourierové transformace

d = fftshift(fft2(im));

% Rozklad a omezeni na CFS koeficientu

m = size(coef);
vel = m(1)*m(2);
V = reshape(coef,1,vel); % vytvoreni vektoru z matice koeficientu a dosazeni hodnot coef
XX = zeros(1,vel); % vytvoreni prazdneho vektoru
[~,S]=sort(abs(V),'descend'); % serazeni koeficientu dosazenych do vektoru po porade a to sestupne od nejvetsich po nejmensi

%% vlozeni vybraneho poctu koeficientu ze serazeneho vektoru do prazdne promenne XX

i=1;
while i < vel + 1 && i < cfs + 1 
    XX(S(i)) =V(S(i));
    i = i+1;
end
%% omezene koeficienty

ocoef = reshape(XX,m(1),m(2)); %vytvireni matice z radkoveho vektoru XX


dd(20,25) = 1;
% Rekonstrukce z omezeneho počtu koeficientů
output = ifft2(ifftshift(dd));

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

% %zobrazení rekonstruovaného obrazu
% imshow(uint8(output))

figure;
o =fft2((output));
mesh(abs(o));

%% Vypocty, PSNR, SNR, MSE, SSIM
xx = double(im)/256; 
xhat1 = (output/256); 
error = mean(mean(((xx)-(xhat1)).^2));  %MSE
err = xx - xhat1;                   
err = abs(err(:));
ssm = ssim(im,output);
PSNRdb = 10 * log10(1/mean(err .^2));   %PSNR

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

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