% sažimanje slike pomoću SVD-a % potreban je image package % Numerička matematika % Marko Hajba clear all; close all; clc A=imread('photo3','png'); % ucitavanje slike 512x512 Abw2=rgb2gray(A); %pretvaramo sliku u crno-bijelu Abw=double(Abw2); %za racun trebamo realne brojeve [nx,ny]=size(Abw); %dimenzije slike (broj piksela) figure(1), subplot(1,2,1), imshow(Abw2) %crno-bijela verzija %spremi crno-bijelu verziju slike imwrite(Abw2, 'BW_original.jpg') [U, S, V] = svd(Abw); %SVD matrice MSE_error=[]; PSNR_error=[]; norm_2_error = []; brojac=1; for k = 4 : 20: 244 %odabir ranga aproksimacije k A1 = U(:, 1:k) * S(1:k, 1:k)* V(:, 1:k)'; %reducirana slika %vracamo koeficijente u raspon 0-255: A1_comp=uint8(A1); %%% 2 norma je sigma_k+1 norm_2_error(brojac) = S(k+1, k+1) %%% racunamo MSE: D = abs(Abw-double(A1_comp)).^2; MSE_error(brojac)=sum(D(:)) / (nx*ny) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% racunamo PSNR: PSNR_error(brojac)=10* log10(255^2/ MSE_error(brojac)) figure(1), subplot(1,2,2), imshow(A1_comp), title(['k=' num2str(k)]) %crno-bijela verzija w8 = waitforbuttonpress; brojac=brojac+1; end %spremi sliku u file %imwrite(A1_comp, 'compress_svd.jpg')