Chapitre 3 : NORME JPEG
Exemple complet
Soit l’image suivante (512x512) :
Cette image est en noir et blanc (nuances de gris) , c'est-à-dire qu’on ne va travailler qu’avec une seule matrice au lieu de trois (mode RVB), on a dans ce cas R=V=B.
La matrice de pixels du bloc :
Dans ce cas (nuances de gris), on pas besoin de passer au mode YCbCr puisque Y=G, et donc les matrices Cb et Cr prendront de l’espace inutilement.
Puisqu’on n’est pas passé au mode YCbCr, on ne va pas effectuer le sous-échantillonnage qui s’applique sur les composantes Cb et Cr. (Chrominance).
Avant d’appliquer la DCT on va retrancher 128 :
G_128 = G – 128 (avec G en mode « double (pour les
nombres négatifs) »):
Application de la DCT sur G_128 :
Quantification :
Puisque la composante Y est équivalente à la matrice de pixels, dans ce cas, on va utiliser une table de quantification basée sur la table de quantification de luminance :
(Si l’image est en couleurs RVB, dans ce cas on va utiliser une table de quantification de luminance pour Y et une table de chrominance pour CB et CR. Ces tables changent bien sûr en fonction de la qualité).
La table de luminance par défaut (pour qualité=50) :
Pour cet exemple, on va prendre qualité=15, ce qui donne la table suivante :
Calcul de la matrice quantifiée :
Parcours en zigzag :
Encodage RLE :
Le caractère ‘e’ est un simple marqueur de fin du bloc.
Comparaisons :
Taille de l’image brute : 8x64 = 512 bits (Si on suppose qu’elle est codée en mode nuances de gris (grayscale), sinon sa taille en mode RVB = 3x8x64= 1536 bits).
Taille du code RLE : 33*8 = 246 bits ! Soit une réduction de 52% (84% si on suppose que l’image brute est en mode RVB).
Codage de HUFFMAN (version améliorée):
Matrice d’occurrences :
(On ne compte pas le ‘e’ qui marque la fin du code RLE du bloc puisqu’on va appliquer juste après le codage de HUFFMAN, on va l’ajouter à la fin du code HUFFMAN)
Modification de la matrice d’occurrences :
Algorithme :
taille2=arrondir(taille/2) % Dans ce cas taille=12 dans taille2=arrondir(6)=6
pour i=1:2:taille2-1 % Pas de 2
var=mat_occ{1,taille2+1-i}; % Echanges pour la première ligne
mat_occ{1,taille2+1-i}=mat_occ{1,taille-i};
mat_occ{1,taille-i}= var;
var=mat_occ{2,taille2+1-i}; % Echanges pour la deuxième ligne
mat_occ{2,taille2+1-i}=mat_occ{2,taille-i};
mat_occ{2,taille-i}=var;
fin
Matrice d’occurrences modifiée :
Tri des deux parties du tableau :
Maintenant on va trier le tableau de 1 jusqu’à taille2 et de taille2+1 jusqu’à taille :
Arbre de Huffman
Code Huffman et dictionnaire
Ce qui donne : 84 +12*8 +50 + 8 = 238 bits (84: le nombres de bits dans le code huffman, 12*8 : car on a 8 caractère codé chacun sur 1 octet; 54 :pour la somme des représentation de ces caractères;le 8 ajouté est réservé pour l’octet de fin de code) ce qui équivaut à une réduction de 54% (84,5% si on suppose que l’image brute est en mode RVB).
Remarque : Le codage de HUFFMAN n’a pas été très performant dans ce cas car le codage RLE a été performant et ce parce que la matrice de quantification est grande (qualité faible de l’image).
Codage inspiré de HUFFMAN (HUFFMAN2) :
Ce type de codage qu’on a réalisé s’inspire du codage de HUFFMAN. En effet, on va associer à chaque élément (qui est codé sur 1 octet) un code binaire mais cette fois sans arbre de HUFFMAN. L’idée est d’exploiter les codes binaires donnés pour les nœuds de l’arbre de HUFFMAN et donc inutilisable par les éléments. Pour avoir un code optimal, il suffit de donner à l’élément qui se répète le plus le code binaire ‘0’ et puis on incrémente ‘1’ pour les éléments qui se répètent le moins.
Matrice d’occurrences :
Inversement de l’ordre:
Code:
Ce qui donne : 59 + 12*8 + 34 + 8 = 197 soit une réduction de 61.5% (87.17% si on suppose que l’image brute est en mode RVB).
RESULTATS | |
---|---|
Image |
Statistiques |
Image brute: Taille (grayscale) : 262 ko Taille (RVB) : 786 ko
|
|
Image compressée : Qualité=15 RLE : Huffman 1: Huffman 2: |
|
Image compressée : Qualité=10 RLE : Huffman 1: Huffman 2: |
|
Image brute : 786 ko Image compressée : Qualité=10 RLE : Huffman 1 : Huffman 2 : 74.2 ko (- 90.6%) |
|
Image compressée avec Photoshop CS4 (Qualité=0): 32.3ko |
|
Image compressée avec Matlab R2009a (Qualité=60): 24.8 ko |