Algorithme MATLAB de compression d’images en niveaux de gris via SVD tronquée, optimisant le compromis entre qualité visuelle et taux de compression.
% Compression d'images via SVD tronquée avec analyse qualité-compression
% Auteur : Senior Software Engineer + formateur
% Date : 2024
clear; close all; clc;
% --- Paramètres configurables ---
immagine_path = 'cameraman.tif'; % Chemin de l'image d'entrée (niveaux de gris)
valori_singolari = 1:5:100; % Vecteur des valeurs singulières k à tester
salva_immagini = false; % Drapeau pour sauvegarder les images compressées
% --- Chargement de l'image ---
img_orig = imread(immagine_path);
if size(img_orig,3) > 1
error('L''image doit être en niveaux de gris');
end
img_orig = double(img_orig); % Conversion en double pour calculs numériques
% Dimensions de l'image
[m, n] = size(img_orig);
% Préallocation des vecteurs pour les résultats
psnr_values = zeros(length(valori_singolari),1);
compression_ratio = zeros(length(valori_singolari),1);
% Calcul de la taille originale en octets (uint8)
dim_orig_bytes = m * n; % 1 octet par pixel en uint8
% Boucle sur différentes valeurs de k (valeurs singulières conservées)
for idx = 1:length(valori_singolari)
k = valori_singolari(idx);
% --- Décomposition SVD ---
% U : m x m, S : m x n, V : n x n
[U,S,V] = svd(img_orig, 'econ'); % 'econ' pour décomposition économique
% --- Troncature des matrices ---
U_k = U(:,1:k); % m x k
S_k = S(1:k,1:k); % k x k
V_k = V(:,1:k); % n x k
% --- Reconstruction de l'image compressée ---
img_compressa = U_k * S_k * V_k';
% --- Calcul du PSNR ---
mse = mean((img_orig(:) - img_compressa(:)).^2);
if mse == 0
psnr_val = Inf; % Image identique
else
max_pixel = 255;
psnr_val = 10 * log10( (max_pixel^2) / mse );
end
psnr_values(idx) = psnr_val;
% --- Calcul du ratio de compression ---
% On stocke uniquement U_k, S_k (diagonale), V_k
% Taille compressée approximative en octets :
% U_k : m*k*8 octets (double précision)
% S_k : k*8 octets (diagonale)
% V_k : n*k*8 octets
% Total = 8*k*(m + n + 1) octets
dim_compressa_bytes = 8 * k * (m + n + 1);
compression_ratio(idx) = dim_orig_bytes / dim_compressa_bytes;
% --- Affichage des images pour certaines valeurs k sélectionnées ---
if ismember(k,[5,20,50,100])
figure;
subplot(1,2,1);
imshow(uint8(img_orig));
title('Image originale');
subplot(1,2,2);
imshow(uint8(min(max(img_compressa,0),255)));
title(sprintf('Image compressée avec k=%d', k));
% Sauvegarde de l'image compressée si demandé
if salva_immagini
nome_file = sprintf('immagine_compressa_k%d.png', k);
imwrite(uint8(min(max(img_compressa,0),255)), nome_file);
end
end
end
% --- Graphique du compromis qualité-compression ---
figure;
plot(compression_ratio, psnr_values, '-o','LineWidth',2);
grid on;
xlabel('Ratio de compression (original / compressé)');
ylabel('PSNR (dB)');
title('Compromis qualité vs compression avec SVD tronquée');
% Mise en évidence des valeurs maximales et recommandées
[max_psnr, idx_max] = max(psnr_values);
k_ottimale = valori_singolari(idx_max);
fprintf('Valeur optimale k = %d avec PSNR = %.2f dB et ratio de compression = %.2f\n', k_ottimale, max_psnr, compression_ratio(idx_max));
% --- Fin du script ---Image d'entrée en niveaux de gris (matrice 2D double ou uint8).
Fonction MATLAB svd() pour la décomposition en valeurs singulières.
Paramètres de configuration : nombre de valeurs singulières k à conserver.
Calcul du PSNR pour évaluer la qualité de l'image reconstruite.
Visualisation graphique pour la comparaison image originale vs compressée.
Boucle pour analyse automatique du compromis qualité-compression.
Sauvegarde optionnelle de l'image compressée au format PNG.
Arduino NON utilisé dans ce projet (logiciel MATLAB autonome).
Dépendances logicielles : MATLAB de base (version R2016b ou supérieure recommandée pour les fonctions graphiques et la gestion des images).
Configuration : assurez-vous que le dossier de travail contient l'image d'entrée ou modifiez le chemin dans le code.