Verwenden von SVD zum Komprimieren eines Bildes in MATLAB

Ich bin neu in MATLAB, aber ich versuche, Bildkomprimierungscode für Graustufenbilder zu erstellen.

Fragen

Wie kann ich mit SVD niedrigwertige Eigenwerte abschneiden, um ein komprimiertes Bild zu rekonstruieren?

Arbeit / Versuche soweit

Mein Code ist bisher:

B=imread('images1.jpeg');   
B=rgb2gray(B);  
doubleB=double(B);  
%read the image and store it as matrix B, convert the image to a grayscale
photo and convert the matrix to a class 'double' for values 0-255  
[U,S,V]=svd(doubleB);

Dadurch kann ich die Bildmatrix mit den in der Variablen S gespeicherten Eigenwerten erfolgreich zerlegen.

Wie schneide ich S ab (das ist 167x301, class double)? Angenommen, von den 167 Eigenwerten, die ich nur auf die Top 100 (oder ein beliebiges n) setzen möchte, wie mache ich das und rekonstruiere das komprimierte Bild?

Code / Gedanken aktualisiert

Dies ist der aktuelle Entwurf, den ich habe, anstatt eine Menge Code in den Kommentarbereich zu schreiben. Ich konnte das komprimierte Bild erfolgreich erstellen, indem ich N manuell geändert habe, aber ich möchte zwei zusätzliche Dinge tun:

1- Zeigen Sie eine Reihe von Bildern für verschiedene Komprimierungen an (z. B. eine Schleife für N = 5,10,25 usw.).

2- Berechnen Sie irgendwie die Differenz (den Fehler) zwischen jedem Bild und dem Original und zeichnen Sie es grafisch auf.

Ich bin schrecklich, wenn ich Loops und Output verstehe, aber das habe ich versucht:

B=imread('images1.jpeg');  
B=rgb2gray(B);  
doubleB=im2double(B);%  
%read the image and store it as matrix B, convert the image to a grayscale  
%photo and convert the image to a class 'double'  
[U,S,V]=svd(doubleB);   
C=S;  
for N=[5,10,25,50,100]  
C(N+1:end,:)=0;  
C(:,N+1:end)=0;  
D=U*C*V';  
%Use singular value decomposition on the image doubleB, create a new matrix  
%C (for Compression diagonal) and zero out all entries above N, (which in  
%this case is 100). Then construct a new image, D, by using the new  
%diagonal matrix C.  
imshow(D);  
error=C-D;  
end

Offensichtlich gibt es einige Fehler, weil ich nicht mehrere Bilder bekomme oder die Fehlermatrix "grafisch darstellen" kann

Antworten auf die Frage(4)

Ihre Antwort auf die Frage