Utiliser SVD pour compresser une image dans MATLAB

je suis tout nouveau à MATLAB mais j'essaie de faire un peu de code de compression d'image pour les images en niveaux de gris.

Questions

Comment puis-je utiliser SVD pour couper des valeurs propres de faible valeur pour reconstruire une image compressée?

Travail/Tentatives de la mesure

Mon code pour l'instant est:

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);

cela me permet de décomposer avec succès la matrice d'image avec des valeurs propres stockées dans la variable S.

Comment puis-je troncature S (qui est 167x301, classe double)? Disons que sur les 167 valeurs propres que je veux prendre seulement le top 100 (ou n'importe quel n vraiment), comment puis-je faire cela et reconstruire l'image compressée?

mise à Jour de code/pensées

au Lieu de mettre un tas de code dans la section des commentaires, c'est l'actuel projet que j'ai. J'ai réussi à créer l'image compressée en changeant manuellement N, mais j'aimerais faire 2 choses supplémentaires:

1- Afficher un panneau d'images pour différentes compressions (i/e, lancer une boucle pour N = 5,10,25, etc.)

2 - calculez D'une façon ou d'une autre la différence (erreur) entre chaque image et l'original et faites le graphe.

je suis horrible avec la compréhension des boucles et de la sortie, mais c'est ce que j'ai essayé:

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

évidemment il y a des erreurs parce que je ne reçois pas plusieurs images ou ne sais pas comment "graphe" la matrice d'erreur

15
demandé sur Rodrigo de Azevedo 2012-11-29 01:39:02

4 réponses

juste pour commencer, je suppose que vous êtes conscient que le SVD n'est vraiment pas le meilleur outil pour décorer les pixels dans une seule image. Mais il est de bonne pratique.

OK, donc nous savons que B = U*S*V'. Et nous savons que S est diagonal, et trié par magnitude. Ainsi, en utilisant seulement les quelques valeurs supérieures de S, vous obtiendrez une approximation de votre image. Disons C=U*S2*V', où S2 est votre s modifié les tailles de U et V n'ont pas changé, donc la chose la plus facile à faire pour le moment est de mettre à zéro les éléments de S que vous ne voulez pas utiliser, et exécuter la reconstruction. (La façon la plus facile de le faire: