TP-compression-streaming-in.../QuantificationDCT.m

83 lines
3 KiB
Mathematica
Raw Normal View History

2023-06-25 14:32:14 +00:00
% TP Codages JPEG et MPEG-2 - 3SN-M - 2022
%--------------------------------------------------------------------------
% Fonction de quantification (directe et inverse) des coefficients DCT
%--------------------------------------------------------------------------
% I_Quant = QuantificationDCT(sens,I_DCT,canal,F_Qualite,taille_bloc)
%
% sorties : I_Quant = image quantifiee
%
% entrees : sens = sens de la quantification : 'Direct' ou 'Inverse'
% I_DCT = image avant la quantification
% canal = canal pour le choix de la table de quantification :
% 'Luminance', 'Chrominance' ou 'Residu'
% F_Qualite = facteur de qualite pour la compression
% taille_bloc = taille des blocs pour la DCT (ici 8x8)
%--------------------------------------------------------------------------
function I_Quant = QuantificationDCT(sens, I, canal, F_Qualite, taille_bloc)
T = ChoixTableQuantification(canal, F_Qualite);
if sens == "Direct"
fun = @(block_struct) round( block_struct.data ./ T );
elseif sens == "Inverse"
fun = @(block_struct) round( block_struct.data .* T );
end
I_Quant = blockproc(I, [taille_bloc taille_bloc], fun);
end
%--------------------------------------------------------------------------
% Fonction de selection d'une table de quatification JPEG en fonction du
% type de canal et du facteur de qualite
%--------------------------------------------------------------------------
% T_Quant = ChoixTableQuantification(Canal, F_Qualite)
%
% sortie : T_Quant = Table de quantification JPEG
%
% entrees : canal = 'Luminance' ou 'Chrominance' (tables differentes)
% F_Qualite = facteur de qualite (entre 0 et 97)
%--------------------------------------------------------------------------
function T_Quant = ChoixTableQuantification(canal,F_Qualite)
if canal == "Luminance"
T50 = [
16 11 10 16 24 40 51 61;
12 12 14 19 26 58 60 55;
14 13 16 24 40 57 69 56;
14 17 22 29 51 87 80 62;
18 22 37 56 68 109 103 77;
24 35 55 64 81 104 113 92;
49 64 78 87 103 121 120 101;
72 92 95 98 112 100 103 99
];
elseif canal == "Chrominance"
T50 = [
17 18 24 47 99 99 99 99 ;
18 21 26 66 99 99 99 99 ;
24 26 56 99 99 99 99 99 ;
47 66 99 99 99 99 99 99 ;
99 99 99 99 99 99 99 99 ;
99 99 99 99 99 99 99 99 ;
99 99 99 99 99 99 99 99 ;
99 99 99 99 99 99 99 99
];
elseif canal == "Residu"
T50 = ones(8, 8) * 16;
end
if F_Qualite > 50
T_Quant = (100 - F_Qualite) * T50 / 50;
elseif F_Qualite < 50
T_Quant = 50 * T50 / F_Qualite;
else
T_Quant = T50;
end
T_Quant = round(T_Quant);
end