Compression JPEG Benjamin Navaro et Cédric Rabasse Résumé DCT, IDCT, décorrélation, énergie, quantification 1 Le JPEG : une introduction La norme JPEG définit les étapes de transformation d une image en une image compressée. Elle ne définit en aucun cas le format de fichier généré en sortie. Dans le langage courant on utilise donc à tort le terme de fichier JPEG pour parler du format de fichier (réellement appelé JFIF) et non de la technique de transformation et d encodage de l image. " # $!! " # $ " # $ FIG. 1 Etapes de la transformation JPEG Nous allons ici étudier la transformation permettant de représenter différemment l image pour un encodage efficace : la DCT, Discrete Cosine Transform. Tout comme la
Compression JPEG 2 transformée de Fourier, cette transformation est conservatrice puisqu elle ne fait que représenter les pixels de l image dans un autre espace. 2 Le principe de la DCT 2.1 La DCT : une technique permettant de concentrer l énergie Soit la matrice W définie par : Soit un signal x défini par : 1. Calculer x new = Wx. W = 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 x = 4 6 5 2 2. Que représente la première valeur de x new? 3. Calculer l énergie du signal x et l énergie du signal x n ew. 4. Comparer l énergie de x au carré de la première de la valeur de x new. Conclure. 2.2 La DCT : une projection fréquentielle 1. Représenter chacune des lignes de W comme un signal monodimensionnel en utilisant la fonction subplot. 2. Comparer la fréquence de chacun des signaux? 3. Conclure quant aux valeurs de x new. 2.3 La DCT : une décorrélation des pixels Soit un signal monodimensionnel x(t) = sin(t) où t = 0 : T e : 2π T e de n points avec T e = 0.01. 1. Représenter dans un espace bidimensionnel en abscisse x(t) et en ordonnée x(t + 1) (x(n) = x(0)). Que représente-t-on ainsi? 2. Soit une matrice de rotation W définie par : ( ) sin(θ) cos(θ) W = cos(θ) sin(θ)
Compression JPEG 3 avec θ = π 4. Calculer X new = WX [ x(0)... x(n 2) x(n 1) = W x(1)... x(n 1) x(0) ] Commenter le résultat en expliquant l influence de la rotation sur la corrélation de x(t) et x(t + 1). 3. Comparer la matrice W de taille 2 2 avec la matrice W de taille 4 4 vue en 2.1. Conclure. 3 La DCT en 2 dimensions Dans le format JPEG, la transformation de l image (signal bidimensionnel) par une DCT s effectue sur des blocs de 8 8 pixels sans recouvrement. Nous allons donc prendre une image de taille L L où L est un multiple de 8 afin d éviter les problèmes de transformation au bord de l image. Sur chacun des blocs, on effectue une DCT définie par : DCT(i, j) = 1 N 1 N 1 ( (2x + 1)iπ ) ( (2y + 1) jπ ) C(i)C( j) p(x, y) cos cos x=0 y=0 N : la largeur d un bloc, ici N = 8. i, j : les indices d un coefficient de la DCT dans un bloc. x, y : les indices d un pixel de l image dans un bloc. DCT(i, j) : la valeur d un coefficient dans un bloc. C(x) = 1 si x 2 = 0, C(x) = 0 sinon. La DCT inverse est définie par : IDCT(x, y) = 1 N 1 i=0 N 1 C(i)C( j)dct(i, j) cos j=0 3.1 Programmation de la DCT en 2 dimensions ( (2x + 1)iπ ) ( (2y + 1) jπ ) cos 1. Programmer une fonction mydct2d(b) où B est un bloc de N N pixels réalisant la DCT bidimensionnelle. 2. Effectuer le découpage de l image cameraman.tif de Matlab en blocs de 8 8 pixels et utiliser la fonction mydct2d sur chacun des blocs. 3. Afficher l image I DCT obtenue. Commenter (cf. question 3 du 2.1).
Compression JPEG 4 3.2 Programmation de la DCT inverse en 2 dimensions 1. Programmer une fonction myidct2d(b) où B est un bloc de N N pixels réalisant la DCT inverse bidimensionnelle. 2. Effectuer le découpage de l image I DCT en blocs de 8 8 pixels et utiliser la fonction myidct2d sur chacun des blocs. 3. Afficher l image I IDCT obtenue. La comparer à l image I. Commenter. 4 Compression d une image La tranformation d une image par DCT ne réduit en rien le nombre de coefficients pour la compresser. Il convient donc d utiliser une matrice de quantification permettant de réduire la précision de l entier codé et ne conserver que les coefficients significatifs. Il faut cependant faire un compromis entre la compression et la qualité de l image : meilleure est la compression, moins bonne est la qualité de l image. 4.1 Quantification Soit la matrice de quantification Q définie pour chacun des blocs de l image par : Q(i, j) = 1 + (1 + i + j)f q Q(i, j) : valeur du pas de quantification dans un bloc (i = 0... N 1 et j = 0... N 1). F q : facteur de qualité de la quantification. 1. Programmer une fonction quantification(n, Fq) retournant la matrice Q de taille N N avec un facteur de qualite Fq. 2. Fixer F q = 5 et calculer Q avec N = 8. Commenter. 3. Faire varier F q et expliquer l influence de F q sur la quantification. 4. Application : effectuer cette quantification pour chacun des blocs de I DCT avec Q = 5. Arrondir les valeurs calculées en utilisant round() ou int16(). On appelle cette matrice I DCTQ. Calculer I IDCT à partir de I DCTQ. Recommencer en prenant Q = 10 et Q = 20. 4.2 Taux de compression Pour calculer le taux de compression de l image obtenue, il faut d abord encoder l image dans un format proche du format final du JPEG (le JFIF). Pour cela, il faut transformer chacun des blocs 8 8 pixels de l image I DCTQ en des vecteurs de 64 coefficients en parcourant ces blocs en zigzag (cf. figure 2). 1. Expliquer l intérêt de parcourir chacun des blocs 8 8 pixels de I DCTQ en zigzag. 2. Programmer une fonction zigzag(b), retournant un vecteur z résultat du parcours en zigzag d un bloc B de 8 8 pixels.
Compression JPEG 5 FIG. 2 Parcours des blocs 8 8 pixels en zigzag Après avoir parcouru un bloc B en zigzag, il convient d encoder ce bloc. Chaque bloc sera encodé par la méthode RLE, Run-Length Encoding. Cette méthode consiste à coder une paire de valeurs : l une est la valeur du nombre, l autre est le nombre de répétitions de ce nombre. Par exemple 0000000001110000 sera codé (0, 9), (1, 3), (0, 4). 1. Utiliser la fonction rle(b) pour encoder chacun des blocs B de I DCTQ. 2. Calculer le nombre total C de coefficients (2 par paire) utilisé pour encoder I DCTQ. 3. Calculer le taux de compression T entre le nombre C de coefficients de l image encodée et le nombre total N N de pixels de l image original. 4. Faire varier F q et commenter. 4.3 Rapport signal sur bruit 1. Calculer le rapport signal sur bruit RSB entre l image original et le bruit correspond à la différence entre I et I DCTQ. 2. Faire varier F q et commenter. 5 Annexes 5.1 Fonction Matlab effectuant l encodage et le décodage RLE 1 function data = rle ( x) 2 % data = rle ( x) ( de) compresses the data with the RLE - Algorithm 3 % Compression : 4 % if x is a numbervector data {1} contains the values 5 % and data {2} contains the run lenths 6 % 7 % Decompression : 8 % if x is a cell array, data contains the uncompressed values
Compression JPEG 6 9 % 10 % Version 1.0 by Stefan Eireiner ( < a href =" mailto : stefan - e@ web. de? subject = rle "> stefan - e@web.de </a >) 11 % based on Code by Peter J. Acklam 12 % last change 14. 05. 2004 13 14 if iscell ( x) % decoding 15 i = cumsum ([ 1 x {2} ]); 16 j = zeros (1, i( end ) -1); 17 j(i (1: end -1) ) = 1; 18 data = x {1}( cumsum (j)); 19 else % encoding 20 if size ( x,1) > size ( x,2), x = x ; end % if x is a column vector, tronspose 21 i = [ find (x (1: end -1) ~= x (2: end )) length (x) ]; 22 data {2} = diff ([ 0 i ]); 23 data {1} = x(i); 24 end