//  Reconstruction d'images par SVD
//  Utilisation de la toolbox IPD
//  Images disponibles en noir et blanc
//  boat.png, cameraman.png, peppers-bw, shepp256.png,
//  Sinogram1.png, taxi3.png

clear();
stacksize('max');

//  Lecture image
    a = ReadImage('boat.png');
    a = double(a);  //  a contient des valeurs réeelles
    
//  Affichage image
    figure();
    ShowImage(a(:,:,2),'Taxi');

//  Calcul de la svd
    [u,s,v] = svd(a(:,:,2));
    
//  Plot des valeurs singulières
    lp = min(size(s));    
    figure();
    plot2d([1:lp]',diag(s));
    
//  Reconstruction approximative de l'image     
    vs = [50, 60, 70, 80, 90, 100];    //  p = nombre valeurs singulières utilisées
    for i = 1:size(vs,2);
        q = zeros(size(s));
        p = vs(i);
        q = u(:,1:p)*s(1:p,1:p)*v(:,1:p)';
        ps = string(p);
        lbl = 'Taxi reconstitue p = '+ps;
        figure();
        ShowImage(uint8(q),lbl);
    end;
    
