function [sl_rek] = SPIHT_main (slika, n_razl, bpp) 
% SPIHT_main - glavna funkcija
% Ulazi: slika - matrica slike od koje je oduzeta vrijednost 128
%         n_razl - broj razina razlaganja DWT-a
%         bpp - broj bita po pikselu
% Izlaz: sl_rek - matrica rekonstruirane slike
% Slika se razlaze DWT-om te se kodira SPIHT-om. Nastali niz bitova predaje
% se SPIHT dekoderu te se slika rekonstruira DWT-om.

% NMDOS projekt, 15.1.2009.
% Autor: Vana Jelièiæ


[sizey sizex]=size(slika);
slika1=slika+128; %sluzi za racunanje pogreske (originalnoj slici prethodno oduzeli 128)

string_orig = ['Original ',  num2str(sizey) 'x' num2str(sizex) 'px, velièina ' num2str(sizey*sizex*8) 'B'];
string_decomp = ['DWT dekompozicija, Haar, broj razina razlaganja= ' num2str(n_razl)];

disp('Starting image decomposition');
[DWT] = DWT_decomposition (slika, n_razl);
figure, imshow (DWT, [])
title(string_decomp);

disp ('Starting SPIHT coding');
[bitstream, time_coder]=SPIHT_coder(DWT, n_razl, bpp);
disp (['Kodiranje zavrseno. Formiran niz bitova duljine ', num2str(length(bitstream)) ' bitova.']); 
disp (['Vrijeme potrebno za kodiranje: ' num2str(time_coder) ' s.']);

disp('Starting SPIHT decoding');
[DWT_rek, time_dec]=SPIHT_decoder(bitstream);
disp ('Dekodiranje zavrseno.')
disp (['Vrijeme potrebno za dekodiranje: ' num2str(time_dec) ' s.']);

disp('Starting image reconstruction');
sl_rek=DWT_reconstruction(DWT_rek, n_razl); 


sum=0;
for i=1:sizey
    for j=1:sizex
        sum=sum+ (slika1(i,j)-sl_rek(i,j))^2;
    end
end
MSE=sum/(sizey*sizex);
PSNR=10*log10(255^2/MSE);

disp (['PSNR iznosi ' num2str(PSNR) ' dB.']);

string_rek = ['Rekonstruirana slika, bpp=' num2str(bpp)]; 
string_rek1= ['Kompresija= ' num2str(round(8/bpp)) ' puta, PSNR= ' num2str(PSNR) 'dB'];
%'Velièina=' num2str(round(sizey*sizex*bpp)) 'B

figure;
subplot(1,2,1);
imshow(slika1,[]);
title(string_orig);

subplot(1,2,2);
imshow(sl_rek,[]);
title(string_rek);
xlabel(string_rek1);

pogreska=abs(slika1-sl_rek); 
figure,imshow(pogreska, [])
title('Pogreška');



