2016-04-25 4 views
0

Screenshot of the reading.Wie berechne ich eine abgeschnittene Summe Approximation?

Ich bin ein Bild zu machen, konvertieren Sie es in einen Satz von 3 Matrizen mit imread(), dann berechnen Sie eine abgeschnittene Summe Annäherung an jede Matrix mit N=1,2,3,4,8,16,32,64,128 Begriffe. Ich habe die Matrizen, aber ich bin nicht wirklich sicher über diesen letzten Teil und das Lesen ist ein bisschen vage. Was meinen sie mit einer abgeschnittenen Summenapproximation?


aktualisieren basierend auf einer gegebenen Antwort:

Ich habe versucht, die folgenden:

A = double(imread("image.jpg"))/255; 

    [U1, S1, V1] = svd(A(:,:,1)); 
    [U2, S2, V2] = svd(A(:,:,2)); 
    [U3, S3, V3] = svd(A(:,:,3)); 

N = 128;  
trunc_image = (U1(1:763,1:N)*S1(1:N,1:N)*V1(1:N,1:691))*255; 

imwrite(trunc_image, "truncimg.jpg", "jpg"); 

... aber das resultierende Bild sieht wie folgt aus:

screenshot of resulting image

+0

Statt alle singulären Werte aus dem [ 'svd'] verwenden (http://www.mathworks.com/help/ matlab/ref/svd.html) des Bildes verwenden Sie nur die größten (ich nehme in absoluten Werten an) die von * der * größten zu der (laut Ihrer Liste) 128 größten Werte. – TroyHaskin

+0

@TroyHaskin was meinst du? Was kann ich diese Werte * für * – whatwhatwhat

+1

Das Bild, das alle Informationen hat: die Matrix Form des Bildes 'A' über eine SVD zerlegt werden kann, und die Summe' sigma_k * u_k * v_k.'' ist genau das 'A '. Aber Sie können "A" approximieren, indem Sie nur die größten Einzelwerte addieren, anstatt alle. Und wenn "N" (die Anzahl der Terme in der Approximation) kleiner ist als "R" (die Gesamtzahl der singulären Werte), können Sie eine gute Annäherung mit viel weniger Berechnung erhalten. – TroyHaskin

Antwort

2

Wenn Sie svd auf einem Bildausführen:

[U,S,V] = svd(I,'econ'); %//you get matrices U, S, V 

S wird eine diagonal Matrix sein, mit singulären Werte entlang der Diagonalen abnimmt.

Approximation by truncating... bedeutet, dass ich I' durch eliminierte singuläre Werte in S rekonstruieren kann:

I_recon = U(1:256,1:N)*S(1:N,1:N)*V(1:256,1:N).'; %//Reconstruct by keeping the first N singular values in S. 

Was hier passiert, ist, dass I_recon ein Bild von den N bedeutendsten Einzelwerten rekonstruiert ist. Der Zweck dieses Vorgangs ist, dass wir less significant Beiträge zu dem Bild I entfernen und I mit weniger Daten darstellen können.

Dies ist ein Beispiel von rekonstruierten Bildern mit unterschiedlichen N:

SVD reconstruction of I

+0

Ich versuche, was Sie vorgeschlagen haben und es funktioniert nicht. Mein resultierendes Bild ist nur eine Reihe von schwarzen, grauen und weißen Linien, sogar bei N = 128. Dies ist der Code, den ich benutzt habe: 'A = double (imread (" image.jpg "))/255; [U1, S1, V1] = svd (A (:,:, 1)); [U2, S2, V2] = svd (A (:,:, 2)); [U3, S3, V3] = svd (A (:,:, 3)); N = 128; trunc_image = (U1 (1: 763,1: N) * S1 (1: N, 1: N) * V1 (1: N, 1: 691)) * 255; imwrite (trunc_image, "truncimg.jpg", "jpg"); ' – whatwhatwhat

+0

@whatwhatwhat 1) Sie müssen nicht nach dem Lesen des Bildes durch 255 dividieren (Konvertierung in Doppel-Matrix ist genug). 2) Scheint so, als ob du nicht die grünen und blauen Kanäle benutzen musst, also brauchst du die Zeilen 3 und 4 nicht.3) Stellen Sie bei der Rekonstruktion sicher, dass Sie Ihre 'V'-Matrix transponieren. 4) Da Sie mit einer Doppelmatrize arbeiten, sollten Sie sie durch 255 teilen, bevor Sie etwas anzeigen. – Lincoln

+0

Der Grund, warum ich mich anfangs durch 255 teilte, war, weil mein Problemsatz mich dazu anwies, dies zu tun. [Siehe diesen Screenshot] (http://imgur.com/ezzX62). Allerdings sehe ich keinen Sinn darin !! Weißt du, warum es sinnvoll sein könnte, durch 255 zu teilen und dann mit 255 zu multiplizieren, bevor du 'imwrite' verwendest? – whatwhatwhat