function svdimage(imag)
% démontre la compression d'une image avec svd
% poser imag = 'nomdevotreimage.jpg'
% puis taper svdimage(imag) au >>

format short e
% convertir l'image en matrice
% inImage = (imread('Lena.jpg')); 
inImage = imread(imag);  %une matrice généralisée mxnx3 , 3 pour rgb
inImage=rgb2gray(inImage) ; %une matrice mxn  
inImage=double(inImage); %convertir en nombres réelles au lieu de entières
msize = size(inImage,1) ;  

[U,S,V] = svd(inImage);  % donc U*S*V' = inImage
singvals = diag(S);  %les valeurs singulières

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)
fprintf('Rang de la matrice:')
r = rank(inImage)
k=0;
for i=1:s
    if singvals(i)> 0.1 
        k=k+1;
    end;
end;
fprintf('Nombre de valeurs sing > 0.1')
k

continuer = 1;
while continuer>0
    N = input('\n Nombre n de valeurs singulières à utiliser (ou <0 pour quitter): ') ;
    if N>0 && N<r
        % 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);
        
        fprintf('Erreur de l''approximation (pourcentage)im:')
        erreur=norm(inImage-inImage_red,'fro' )/norm(inImage,'fro')  %racine carrée des sommes des carrées (Frobenius)
        fprintf('sigma_N')
        singvals(N)
    else
        N
        continuer=0;
    end;
end

