Implémentation d’un algorithme de compression d’images basé sur la SVD tronquée avec analyse du compromis qualité–compression

Algorithme MATLAB de compression d’images en niveaux de gris via SVD tronquée, optimisant le compromis entre qualité visuelle et taux de compression.

Brève Introduction

Implémentation d’un algorithme de compression d’images basé sur la SVD tronquée avec analyse du compromis qualité–compression (matlab)
DESCRIPTION :
Ce projet MATLAB implémente un algorithme de compression d'images utilisant la décomposition en valeurs singulières tronquée (SVD). L'objectif est de compresser des images en niveaux de gris en réduisant la taille des données tout en maintenant une qualité visuelle acceptable. Le code permet d'analyser le compromis entre le niveau de compression (nombre de valeurs singulières conservées) et la qualité de l'image reconstruite, mesurée par le PSNR (Peak Signal-to-Noise Ratio).

NOTES SUPPLÉMENTAIRES :
Le code est conçu pour des images en niveaux de gris. Pour les images en couleur, il est nécessaire d'appliquer la compression SVD sur chaque canal RGB séparément. Le choix du nombre de valeurs singulières k influence directement la taille compressée et la qualité visuelle. Le code inclut des commentaires détaillés en italien pour faciliter la compréhension et la modification.

EXPLICATIONS :
- La fonction svd() décompose la matrice image en trois matrices U, S, V telles que image = U*S*V'.
- En tronquant la matrice S en ne conservant que les k premières valeurs singulières, on obtient une version compressée de l'image.
- La qualité de l'image compressée est évaluée via le PSNR, qui mesure la différence entre l'image originale et l'image compressée.
- Une valeur PSNR plus élevée indique une meilleure qualité visuelle.
- La boucle for permet de tester différentes valeurs de k pour analyser le compromis entre compression et qualité.
- Les images originales et reconstruites sont affichées côte à côte pour une comparaison visuelle immédiate.

Code d'Exemple : matlab

% 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 ---
×
×
×
Veux-tu régénérer la réponse ?
×
Exporter le chat
Choisissez le format d'export
⏳ Generazione PDF in corso…
Allegati
×
⚠️ Vous êtes sur le point de fermer le chat et de passer au générateur d’images. Si vous n’êtes pas connecté, vous perdrez notre conversation. Confirmez-vous ?
👁 Tu consultes une discussion partagée en mode temporaire. Elle ne sera pas enregistrée.
💬
×
Prompts enregistrés
×
Note privée
×
Étiquette
×
Rechercher dans toutes les discussions
×
Vos insights
Analyse en cours…
×
Préférences IA
Nom de l'assistant 30
Longueur des réponses
Modèle IA
Réponses structurées
Inclure des exemples
Utiliser des emojis
Guide-moi, ne résous pas Des indices et des questions plutôt que la réponse toute faite
Plus de réglages →
×
Partager cette discussion
Toute personne ouvrant ce lien pourra consulter la discussion ou l'ajouter à son profil comme discussion personnelle.
⚠️ Attention : les pièces jointes de la discussion seront également partagées. Qui l'ajoutera recevra une copie des fichiers dans son dossier.
Discussion partagée
Quelqu'un a partagé une discussion avec toi. Veux-tu seulement la consulter ou l'ajouter à tes discussions ?
⚠️ Attention : les pièces jointes de la discussion seront également partagées. Qui l'ajoutera recevra une copie des fichiers dans son dossier.
×

📌 Messages enregistrés

Chargement...

×

Historique des discussions

programmes-exemples · HISTORIQUE DU CHAT

Chargement...

Préférences IA

×
  • 🟢 BasiqueRéponses rapides et essentielles pour étudier
  • 🔵 MoyenQualité supérieure pour étude et programmation
  • 🟣 AvancéRaisonnement complexe et analyses détaillées
Expliquer les étapes

Qu'est-ce qu'il faut ?

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.

Sujets Similaires

Tracé de Plusieurs Courbes sur le Même Graphique avec Légende
Exemple MATLAB pour tracer plusieurs courbes sur un graphique unique avec légende, idéal pour comparer des données et personnaliser l’affichage facilement.
Script pour trier un vecteur avec l’algorithme de tri à bulles
Script MATLAB pour trier un vecteur avec l’algorithme de tri à bulles, idéal pour apprendre les bases du tri en ordre croissant.
Création d’un graphique 3D d’une surface z = f(x,y)
Apprenez à créer un graphique 3D d’une surface z = f(x,y) en MATLAB avec meshgrid, surf, colormap et shading pour une visualisation optimale.
Détection des contours dans les images avec filtre Sobel et comparaison avec Canny sous MATLAB
Détection des contours dans les images avec filtre Sobel et comparaison avec Canny sous MATLAB, code complet et adaptable pour analyse d’images.
Implémentation d’un filtre FIR passe-bande utilisant la fenêtre de Hamming et analyse fréquentielle
Implémentation d’un filtre FIR passe-bande avec fenêtre de Hamming en MATLAB, analyse fréquentielle et filtrage d’un signal test multi-fréquences.
Analyse en Composantes Principales (ACP) sur un Jeu de Données Multivarié et Visualisation 2D/3D
Analyse en Composantes Principales (ACP) avec MATLAB sur données multivariées, normalisation, calcul PCA et visualisation 2D/3D pour explorer les structures.
Implémentation d’un algorithme de régression polynomiale avec sélection automatique du degré optimal
Implémentation MATLAB d’une régression polynomiale avec sélection automatique du degré optimal via validation croisée pour données synthétiques bruitées.
Implémentation d’un filtre de Kalman unidimensionnel pour le suivi d’une position bruitée
Implémentation MATLAB d’un filtre de Kalman unidimensionnel pour estimer la position d’un objet à partir de mesures bruitées avec simulation et visualisation.