TP-compression-streaming-in.../Exercice_5.m
2023-06-25 16:32:14 +02:00

91 lines
3.5 KiB
Matlab

% TP Codages JPEG et MPEG-2 - 3SN-M - 2022
%--------------------------------------------------------------------------
% Exercice_5 : Compression/decompression JPEG avec entropie et PSNR
%--------------------------------------------------------------------------
% Fonctions a coder/utiliser : CompressionJPEG.m
% DecompressionJPEG.m
%--------------------------------------------------------------------------
clear;
close all;
clc;
taille_ecran = get(0,'ScreenSize');
L = taille_ecran(3);
H = taille_ecran(4);
figure('Name','Test de la compression/decompression JPEG',...
'Position',[0.1*L,0.05*H,0.8*L,0.7*H]);
%--------------------------------------------------------------------------
% Chargement de l'image de test
I_for_JPEG = load('Donnees_TP_MPEG-2.mat').I_for_JPEG;
% Choix du canal pour la quantification
canal = 'Luminance';
% Methode de calcul de la DCT 2D par blocs ('Matlab' ou 'Rapide')
methode = 'Rapide';
% Choix du facteur de qualite (ici vecteur allant de 1% a 97%)
F_Qualite_Max = 97;
F_Qualite = 1:F_Qualite_Max;
% Vecteur pour recuperer le poids de l'image pour chaque facteur de qualite
vecteur_Poids = zeros(1,length(F_Qualite));
% Vecteur pour recuperer le PSNR de l'image pour chaque facteur de qualite
vecteur_PSNR = zeros(1,length(F_Qualite));
% Traitement pour chaque facteur de qualite
for f = 1:length(F_Qualite)
% Compression de l'image
[I_Codee,Poids] = CompressionJPEG(I_for_JPEG,canal,methode,f);
% Decompression de l'image
I_Decodee = DecompressionJPEG(I_Codee,canal,methode,f);
% Recuperation du poids des coefficients AC/DC separes
vecteur_Poids(f) = Poids.H_JPEG;
% Calcul et recuperation du PSNR (en uint8 !)
vecteur_PSNR(f) = psnr(uint8(I_Decodee),uint8(I_for_JPEG));
% Affichage de l'image d'origine (en uint8)
subplot 221
imagesc(uint8(I_for_JPEG))
colormap gray
axis image off
title(['Image d''origine (Poids = ' num2str(Poids.Origine,'%.3g') 'ko)'])
% Affichage de l'image reconstruite pour un facteur donne (en uint8)
subplot 122
imagesc(uint8(I_Decodee))
colormap gray
axis image off
title({['Image reconstruite pour F_q = ' num2str(f)] ...
['Poids = ' num2str(Poids.H_JPEG,'%.3g') ' ko'] ...
['PSNR = ' num2str(vecteur_PSNR(f),'%.3g')]})
% Courbes du poids et du PSNR en fonction du facteur de qualite
subplot 223
% Courbe du PSNR
yyaxis left
plot(1:f, vecteur_PSNR(1:f))
xlim([1 97])
ylim([10 50])
xlabel('F_q')
ylabel('PSNR')
% Courbe du poids
yyaxis right
semilogy(1:f, vecteur_Poids(1:f),...
1:F_Qualite_Max,Poids.Origine*ones(1,F_Qualite_Max),'.')
ylim([0 1.1*Poids.Origine])
ylabel('Poids (ko)')
legend('PSNR',...
'Poids de la compression',...
'Poids d''origine',...
'Location', 'NorthWest')
grid on
drawnow;
end
% Affichage de l'image reconstruite pour un facteur donne (en uint8)
subplot 122
imagesc(uint8(I_Decodee))
colormap gray
axis image off
title({['Image reconstruite pour F_q = ' num2str(f)] ...
['Poids = ' num2str(Poids.H_JPEG,'%.3g') ' ko (attendu : 30.7 ko)'] ...
['PSNR = ' num2str(vecteur_PSNR(f),'%.3g') ' (attendu : 47.4)']})