% démontre la compression d'une image avec svd

clear all   % supprimer toutes les variables 
format long e

% step 1: convertir une image en matrice
inImage = (imread('Lena.jpg')); %une matrice généralisé 512x512x3; 3 pour rgb
inImage=rgb2gray(inImage) ; %une matrice 512x512  
inImage=double(inImage); %convertir en nombres réelles au lieu de entières


msize = size(inImage,1) ;  %512 pour notre image

% step 2: decomposing the image using singular value decomposition
[U,S,V] = svd(inImage);  % donc U*S*V' = inImage


% disp('Extraire les valeurs singulières:')
singvals = diag(S);


disp('Nous allons approximer la matrice de l''image avec sa décomposition')
disp('en valeurs singulières.')

fprintf('Nombre de valeurs singulières:')
s=size(singvals,1)

continuer = 1;
while continuer>0
    N = input('\n Nombre n de valeurs singulières à utiliser (ou <0 pour quitter): ') ;
    if N>0
        % On reduit les matrices, enlevant les vecteurs et valeurs dont on n'a pas
        % besoin 
        U_red = U(:,1:N);
        S_red = S(1:N,1:N);
        V_red = V(:,1:N);
        % donc l'approximation réduite à l'image est
        inImage_red = U_red * S_red * V_red';
        % on convertit en image, et on calcule la norme de la différence
        figure;
        buffer = sprintf('Image produit avec %d valeurs singulières ', N)
        imshow(uint8(inImage_red));

        %    fprintf ('Instead of storing originally 512^2 values (each taking 8 bits), \n')
        % fprintf (' one needs to store only %7.0f values, which is approx. %7.2f  %%  of the original size  \n', s*(1+msize+msize), 100*s*(1+msize+msize)/msize^2 )
        title(buffer);
        errornorm=norm(inImage-inImage_red,'fro' )  %racine carrée des sommes des carrées (Frobenius)
    else
        continuer=0;
    end;
end

