Norme JPEG

Un article de Wikipédia, l'encyclopédie libre.

Une photo de fleur compressée en JPEG, avec des compressions de plus en plus fortes, de gauche à droite.
Une photo de fleur compressée en JPEG, avec des compressions de plus en plus fortes, de gauche à droite.

La norme JPEG est une norme qui définit le format d'enregistrement et l'algorithme de décodage pour une réprésentation numérique compressée d'une image fixe.

Sommaire

[modifier] Introduction au JPEG

JPEG est l’acronyme de Joint Photographic Experts Group. C’est un comité d’experts qui édite des normes de compression pour l’image fixe. La norme communément appelée JPEG, de son vrai nom ISO/IEC IS 10918-1 | ITU-T Recommendation T.81, est le résultat de l’évolution des travaux qui ont débuté dans les années 1978 à 1980 avec les premiers essais en laboratoire de compression d’images.

Le groupe JPEG qui a réuni une trentaine d’experts internationaux, a spécifié la norme en 1991. Mais la norme officielle et définitive n'a été adoptée qu'en 1992. Pratiquement, seule la partie concernant le codage arithmétique est brevetée, et par conséquent protégée par IBM, son concepteur.

JPEG normalise uniquement l’algorithme et le format de décodage. Le processus d'encodage est laissé libre à la compétition des industriels et universitaires, du moment que l’image produite est décodable par un décodeur standard. La norme propose un jeu de fichiers de tests appelés fichiers de conformance qui permettent de vérifier qu'un décodeur respecte bien la norme. Un décodeur est alors dit conforme s’il est capable de décoder tous les fichiers de conformance.

JPEG définit deux classes de processus de compression :

  • avec pertes ou compression irréversible. C’est le JPEG « classique ». Il permet des taux de compression de 3 à 100.
  • sans pertes ou compression réversible. Il n’y a pas de pertes d’information et il est donc possible de revenir aux valeurs originales de l’image. Les gains en terme de compression sont alors plus modestes, avec un taux de compression de l’ordre de 2. Cette partie fait l’objet d’une norme spécifique JPEG-LS.

[modifier] La compression JPEG

Nous allons maintenant nous intéresser à l’algorithme.

On peut diviser la compression et la décompression JPEG en 6 étapes dont voici l’organigramme :

Organigramme de compression
Figure 1 : Organigramme de compression.
Cette figure ne représente pas un cycle !

[modifier] Découpage en blocs

Le format JPEG, comme le font généralement les algorithmes de compression à perte, commence par découper l’image en blocs ou carreaux généralement carrés de 64 (8x8) ou 256 (16x16) pixels.

[modifier] Transformation des couleurs

JPEG est capable de coder les couleurs sous n’importe quel format, toutefois les meilleurs taux de compression sont obtenus avec des codages de couleur de type luminance/chrominance tels que YUV, YCbCr car l’œil est assez sensible à la luminance mais peu à la chrominance.

[modifier] Sous-échantillonnage

La façon la plus simple d’exploiter la faible sensibilité de l'œil à la chrominance est simplement de sous-échantillonner les signaux de chrominance. Généralement on utilise un sous-échantillonnage de type 2h1v ou 2h2v. Dans le premier cas (le plus utilisé) on a un sous-échantillonnage 2:1 horizontalement et 1:1 verticalement, dans le deuxième cas on a un sous-échantillonnage 2:1 horizontalement et verticalement. Ces sous-échantillonnages sont utilisés pour les chrominances, pour la luminance on n’utilise jamais de sous-échantillonnage.

[modifier] Transformée DCT

La transformée DCT (Discrete Cosine Transform, en français transformée en cosinus discrète), est une transformation numérique qui est appliquée à chaque bloc et pour chaque « couleur ». Cette transformée est une variante de la transformée de Fourier. Cette méthode permet de décrire chaque bloc en une carte de fréquences et en amplitudes plutôt qu'en pixels et couleurs. La valeur d’une fréquence reflète l’importance et la rapidité d’un changement, tandis que la valeur d’une amplitude correspond à l’écart associé à chaque changement de couleur.

A chaque bloc de n\cdot n pixels sont ainsi associées n\cdot n fréquences

La transformée DCT s’exprime mathématiquement par :

\mathrm{DCT}(i, j)=\frac{2}{N}C(i)C(j)\sum_{x=0}^{N-1}\sum_{y=0}^{N-1}
\mathrm{pixel}(x, y) \cos\left[\frac{(2x+1)i\pi}{2N} \right] \cos\left[\frac{(2y+1)j\pi}{2N} \right]
Équation 1 : Transformée DCT directe.

Et la transformée DCT inverse s’exprime par :

\mathrm{pixel}(x, y)=\frac{2}{N}\sum_{i=0}^{N-1}\sum_{j=0}^{N-1}
C(i)C(j)\,\mathrm{ DCT}(i, j) \cos\left[\frac{(2x+1)i\pi}{2N} \right] \cos\left[\frac{(2y+1)j\pi}{2N} \right]
Équation 2 : Transformée DCT inverse.

Dans les deux cas, la constante C\,\! vaut :

C(x)=\left\{\begin{matrix}\frac{1}{\sqrt{2}}&
\mathrm{pour}~ x = 0 \\[1ex] 1 & \mathrm{pour}~ x > 0 \end{matrix}\right.
Équation 3 : Définition de la constante C.

Pour illustrer la compression, a été repris, un exemple complet provenant de « Digital Images Compression Techniques » de Majid Rabbani et Paul W. Jones.

Matrice (bloc de pixels) de base :

f=\begin{bmatrix} 139 & 144 & 149 & 153 & 155 & 155 & 155 & 155 \\ 144 & 151 & 153 & 156 & 159 & 156 & 156 & 156 \\ 150 & 155 & 160 & 163 & 158 & 156 & 156 & 156 \\ 159 & 161 & 162 & 160 & 160 & 159 & 159 & 159 \\ 159 & 160 & 161 & 162 & 162 & 155 & 155 & 155 \\ 161 & 161 & 161 & 161 & 160 & 157 & 157 & 157 \\ 162 & 162 & 161 & 163 & 162 & 157 & 157 & 157 \\ 162 & 162 & 161 & 161 & 163 & 158 & 158 & 158 \end{bmatrix}
Équation 4 : Matrice d’origine.

En effectuant la transformée DCT on obtient la matrice des fréquences suivante :

F=\begin{bmatrix} 1260 & -1 & -12 & -5 & 2 & -2 & -3 & 1 \\ -23 & -17 & -6 & -3 & -3 & 0 & 0 & -1 \\ -11 & -9 & -2 & 2 & 0 & -1 & -1 & 0 \\ -7 & -2 & 0 & 1 & 1 & 0 & 0 & 0 \\ -1 & -1 & 1 & 2 & 0 & -1 & 1 & 1 \\ 2 & 0 & 2 & 0 & -1 & 1 & 1 & -1 \\ -1 & 0 & 0 & -1 & 0 & 2 & 1 & -1 \\ -3 & 2 & -4 & -2 & 2 & 1 & -1 & 0 \end{bmatrix}
Équation 5 : Matrice transformée DCT.

[modifier] Remarques

Le calcul d’une DCT est complexe. C’est l’étape qui coûte le plus de temps et de ressources dans la compression et la décompression JPEG, mais c’est peut-être la plus importante car elle nous a permis de séparer les basses fréquences et les hautes fréquences présentes dans l’image.

La puissance de calcul disponible aujourd’hui, alliée à des algorithmes de type FFT très efficaces, permet de rendre le temps de calcul tout à fait acceptable pour l’utilisateur courant, voire imperceptible pour les machines les plus puissantes.

[modifier] Quantification

La quantification est l’étape dans laquelle on perd réellement des informations (et donc de la qualité visuelle), mais c'est celle qui fait gagner beaucoup de place (contrairement à la DCT, qui ne compresse pas).

La DCT a retourné, pour chaque bloc, une matrice de 8x8 nombres (dans l’hypothèse que les blocs de l’image font 8x8 pixels). La quantification consiste à diviser cette matrice par une autre, appelée matrice de quantification, et qui contient 8x8 coefficients savamment choisis par le codeur.

Le but est ici d’atténuer les hautes fréquences, c’est-à-dire celles auxquelles l’œil humain est très peu sensible. Ces fréquences ont des amplitudes faibles, et elles sont encore plus atténuées par la quantification (les coefficients sont même ramenés à 0).

Voici le calcul permettant la quantification :

F^*(u, v) = \left \lfloor { F(u, v) + \left \lfloor {Q(u, v) \over 2 } \right \rfloor \over Q(u, v) } \right \rfloor \cong entier le plus proche \left( { F(u, v) \over Q(u, v) } \right)
Avec :  \lfloor x \rfloor entier directement inférieur à x\,\!
Équation 6 : Calcul de la quantification.

Et pour la quantification inverse :

\hat F(u, v) = F^*(u, v) \cdot Q(u, v)
Équation 7 : Calcul de la quantification inverse.

Comme le montre l’image ci-dessous la quantification ramène beaucoup de coefficients à 0 (surtout en bas à droite dans la matrice, là où sont les hautes fréquences). Seules quelques informations essentielles (coin en haut à gauche) sont gardées pour représenter le bloc.

L'intérêt est qu'au moment de coder le résultat dans le fichier, la longue suite de zéros nécessitera très peu de place !

Mais si la quantification est trop forte (= taux de compression trop élevé), il y aura trop peu de coefficients non nuls pour représenter fidèlement le bloc ; dès lors, à l’écran la division en blocs devient visible, et l'image apparaît « pixellisée ».

Dans notre exemple nous avons pris la matrice de quantification suivante :

Q=\begin{bmatrix} 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 \end{bmatrix}
Équation 8 : Matrice définissant le niveau de quantification.

Ce qui donne comme matrice des fréquences quantifiée :

F^*=\begin{bmatrix} 79 & 0 & -1 & ~0~ & ~0~ & ~0~ & ~0~ & ~0~ \\ -2 & -1 & 0 & 0 & 0 & 0 & 0 & 0 \\ -1 & -1 & 0 & 0 & 0 & 0 & 0 & 0 \\  0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{bmatrix}
Équation 9 : Matrice quantifiée.

[modifier] Remarques

[modifier] Codage, compression RLE et Huffman

Le codage s’effectue en zigzag comme le montre la figure suivante et se termine par un caractère de fin :

Ordre de codage défini par la norme JPEG
Figure 2 : Ordre de codage défini par la norme JPEG.

Codage de notre exemple : 79, 0, -2, -1, -1, -1, 0, 0, -1, EOB\,\!.

Ce résultat est ensuite compressé selon un algorithme RLE basé sur la valeur 0 (le codage RLE intervient uniquement sur cette dernière), puis un codage entropique de type Huffman ou arithmétique.

Avec le schéma de codage très simplifié suivant on remarque que le codage nous délivre deux tables (quatre pour une image couleur). Ces tables étant enregistrées dans le fichier final peuvent être choisies par le compresseur.

Schéma de codage simplifié
Figure 3 : Schéma de codage simplifié.

[modifier] Décompression JPEG

Les étapes de la décompression s’effectuent dans l’ordre inverse de la compression suivant les méthodes définies précédemment (en même temps que la compression).

Voici dans notre exemple le résultat de la décompression :

 f=\begin{bmatrix} 144 & 146 & 149 & 152 & 154 & 156 & 156 & 156 \\ 148 & 150 & 152 & 154 & 156 & 156 & 156 & 156 \\ 155 & 156 & 157 & 158 & 158 & 157 & 156 & 155 \\ 160 & 161 & 161 & 162 & 161 & 159 & 157 & 155 \\ 163 & 163 & 164 & 164 & 162 & 160 & 158 & 156 \\ 163 & 163 & 164 & 164 & 162 & 160 & 158 & 157 \\ 160 & 161 & 162 & 162 & 162 & 161 & 159 & 158 \\ 158 & 159 & 161 & 161 & 162 & 161 & 159 & 158 \end{bmatrix}
Équation 10 : Résultat de la décompression.

Ainsi que la matrice d’erreur :

e=\begin{bmatrix} -5 & -2 & 0 & 1 & 1 & -1 & -1 & -1 \\ -4 & 1 & 1 & 2 & 3 & 0 & 0 & 0 \\ -5 & -1 & 3 & 5 & 0 & -1 & 0 & 1 \\ -1 & 0 & 1 & -2 & -1 & 0 & 2 & 4 \\ -1 & 0 & 1 & -2 & -1 & 0 & 2 & 4 \\ -2 & -2 & -3 & -3 & -2 & -3 & -1 & 0 \\ 2 & 1 & -1 & 1 & 0 & -4 & -2 & -1 \\ 4 & 3 & 0 & 0 & 1 & -3 & -1 & 0 \end{bmatrix}
Équation 11 : Matrice des erreurs réalisées par les pertes.

[modifier] Remarques

Les erreurs sont au maximum de 5 et en moyenne 1,6 sur environ 150 ce qui nous donne une erreur moyenne d’environ 1 %, et tout cela pour un passage de 64 à 10 valeurs (avec le caractère de fin) ; à cela il faut rajouter la matrice de quantification, mais comme généralement on compresse de gros fichiers, elle n’influence que peu.

[modifier] JPEG, codage sans pertes

Ici, la précision p des échantillons varie de 2 à 16 bits. À la place de la DCT, le codage utilise un prédicteur P à trois échantillons.

Schéma de compression JPEG sans pertes
Figure 4 : Schéma de compression JPEG sans pertes.

[modifier] Références


[modifier] Voir aussi

[modifier] Articles connexes

Série JPEG
Groupe JPEG JFIF JPEG-LS Norme JPEG JPEG 2000 Compression par ondelettes