Peintre de poche

Comme une impression de déjà-vu, une image est une succession de points caractérisés par leur composition de rouge, de vert et de bleu. Prenons une petite image affichée sur un écran. Fixons sa taille en pixels (px). 600px de long et 400px de haut. Soit 240 000 pixels ou 720 000 sous-pixels rouge, vert et bleu (RGB).

Prenons octet par sous-pixel afin de coder soit 256 niveaux d’intensité. Avec 3 octets, un par couleur, il devient possible de coder environ 16 millions de couleurs. Cela donne une image correcte. qui pèse 2,16 Mo. Deux disquettes. C’est énorme pour une si petite image. Heureusement il existe une formule magique qui peut diviser par 100 sa taille …

La compression en JPEG

JPEG est l’acronyme de Joint Photography Experts Group, un groupe de travail dont la mission est d’encadrer l’encodage des images numériques. En 1992, ils proposent un algorithme de compression afin de réduire les images qui transitent sur les réseaux, le JPEG. 

Cet algorithme de compression se décompose en 6 étapes qui permettent de diminuer drastiquement la taille d’une image en perdant quelques détails. Les titres des étapes semblent complexes. Il n’en est rien

1. La conversion de l’espace de couleurs.

Un pixel est découpé en trois sous-pixels rouge, vert et bleu (RGB). L’idée ici est d’identifier la couleur suivant 3 autres valeurs. La luminance (Y), la chrominance bleu (Cb) et la chrominance rouge (Cr). La luminance correspond à la quantité de lumière envoyée par le pixel. Noir c’est 0. Blanc c’est 255. Les nuances dépendent des quantités de RGB.

La chrominance bleu est la part de bleu lorsqu’on retire l’information de luminance. Il en est de même pour la chrominance rouge. L’idée est de coder différemment, YCbCr,  les couleurs d’une image pour jouer ensuite sur la perception de l’œil. Ce dernier perçoit mieux les détails en noir et blanc qu’en couleur. Ce qui amène à l’étape 2. 

2. Le sous-échantillonnage chromatique

Voir l’exemple sur Wikipedia, l’image codée par l’information Y ne sera pas dégradée. Par contre les images codées en Cb et Cr verront leurs dimensions divisées par 4. Dans notre cas, Cb et Cr sont réduites à 300px par 200px. Cela revient à diviser pas 2 la taille originale de l’image simplement par cette opération.  

3. Le découpage de l’image en bloc de 8 x 8 pixels

Tout est dans le titre. Les prochaines opérations se feront sur des blocs de 8 par 8 pixels. L’algorithme crée des matrices. Nous obtenons ((600 x 400)/(8 x 8) 3750 blocs ordonnées sur lesquels seront réalisés l’étape 4.  

4. La transformation en cosinus discret (DCT)

Il s’agit de l’étape la plus importante. Chaque matrice de 8 par 8 pixels encodée en YCbCr est recalculée suivant la transformée en cosinus discret. L’idée est de calculer le bloc suivant les informations de fréquence au lieu d’information de couleur. Je ne connais pas assez les outils mathématiques pour détailler ce sujet.

Cependant, on joue sur un autre biais de l’œil. Il distingue mieux les images de bases fréquences que celles de haute fréquence. Voir l’image ci-dessous, les éléments en haut à gauche sont plus visibles que ceux en bas à droite. Certaines données dans la matrice peuvent donc être supprimées

5. La quantification

L’étape de quantification est donc l’étape qui consiste à déterminer quelles informations sont supprimables. Dans les applications de dessin assisté par ordinateur (DAO), à l’enregistrement de l’image, la qualité détermine quelles informations de fréquence dans la matrice seront supprimées.

La quantification permet de déterminer les informations calculées lors de l’étape précédente qui sont pertinentes ou non. Si l’utilisateur souhaite supprimer plus d’informations, il peut l’indiquer à l’algorithme. Cette étape permet de gagner le plus de place lors de la compression. 

6. La compression finale

Le fichier brut d’image peut encore être amélioré par les algorithmes standards de compression. 

  1. L’ordre des blocs en zigzag permet de rapprocher les blocs identiques afin de décrire une seule fois l’information. Le reste étant décrit suivant son écart. 
  2. L’algorithme de compression RLE (ou codage par longueur de plage) est ensuite appliqué. L’idée est de coder les occurrences de données. Un exemple valant mieux qu’une longue explication. aaaabbbbbccc devient a4b5c3 puisqu’il y a 4 ‘a’, 5 ‘b’ et 3 ‘c’. 6 caractères pour en représenter 12.
  3. Le codage de Huffman est enfin utilisé pour gagner ce qui reste à gagner d’espace.

Avec toutes ces stratégies, la taille de l’image peut être divisée facilement par 50. Certes, des informations ont été perdues dans le traitement. Mais pour celui qui la reçoit, cette perte est négligeable par rapport à l’image d’origine. Notre image ne pèse plus que 43,2 ko et est téléchargée instantanément. 

La décompression JPEG

Les étapes précédentes sont réalisées à l’envers afin de retrouver une image RGB qui peut être affichée par la carte graphique. Chapeau l’artiste !

L’algorithme JPEG est l’un des premiers à s’intéresser à l’information pertinente dans une image. En jouant sur les informations de luminance et de fréquence et en supprimant les informations peu pertinentes, le JPEG a permis des gains énormes sur la taille des images. Moins de place sur les disques de stockage et sur les réseaux. Tout le monde y gagne.

Au début des années 2000, l’algorithme a été amélioré et a vu des concurrents proposer d’autres optimisations pour améliorer la qualité ou gagner encore plus de place sur les images. 

Les développeurs et les mathématiciens ont des jeux bien étranges qui profitent à tout le monde. Ces héros mériteraient d’être reconnus. 

Partager l'article !!

J’ai de la chance !!!