k = 100; % Carichiamo l'immagine e rendiamola una matrice di numeri in formato "double" I = imread('peppers.png'); I = double(I); [U,S,V] = svd(I); % Plot dei valori singolari s_values = diag(S); figure semilogy(1:length(s_values),s_values,'k-','LineWidth',2) %% % Proviamo a tenere i primi k valori singolari s_values_first = s_values; s_values_first(k+1:end) = 0; % Ricostruiamo l'immagine che si ottiene con i nuovi valori singolari I_reduced_first = U*diag(s_values_first)*V'; I_reduced_first = uint8(I_reduced_first); imwrite(I_reduced_first,'peppers_reduced_first.png') % Proviamo ad azzerare i primi k valori singolari s_values_first_not = s_values; s_values_first_not(1:k) = 0; % Ricostruiamo l'immagine che si ottiene con i nuovi valori singolari I_reduced_first_not = U*diag(s_values_first_not)*V'; I_reduced_first_not = uint8(I_reduced_first_not); imwrite(I_reduced_first_not,'peppers_reduced_first_not.png') % Proviamo con gli ultimi k valori singolari s_values_last = s_values; s_values_last(end-k:end) = 0; % Ricostruiamo l'immagine che si ottiene con i nuovi valori singolari I_reduced_last = U*diag(s_values_last)*V'; I_reduced_last = uint8(I_reduced_last); imwrite(I_reduced_last,'peppers_reduced_last.png')