91 lines
3.5 KiB
Matlab
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)']})
|