Comprendre la compression d’images

Julius Uy
Julius Uy

Follow

Apr 19, 2019 – 7 min de lecture

Dans les années 1980, Microsoft a développé une solution de rendu d’image agnostique aux périphériques pour les bitmaps : le format de fichier BMP.¹ Ceux qui utilisaient Microsoft Paint auparavant savouraient la taille gigantesque des fichiers produits à partir de simples traits et de remplissages de couleur.

L’idée derrière le format de fichier BMP est que chaque pixel se voit attribuer une valeur de couleur. Donc, si j’ai un bitmap 480×360 supportant 16 millions de couleurs (24 bits), Le bitmap finirait par être quelque part au nord de 4MB en taille.

Figure 1 – La structure du fichier image bitmap (https://en.wikipedia.org/wiki/BMP_file_format)

Ce n’est bien sûr pas idéal si l’on souhaite rendre plusieurs images de haute qualité. D’où la question qu’il faut se poser. « Existe-t-il un moyen d’optimiser la représentation bitmap de telle sorte que l’on puisse toujours préserver l’intégrité visuelle de l’image mais en utilisant moins de ressources ? »

La réponse est oui. Il s’avère que, pour la plupart, les utilisateurs sont plus intéressés par les images en tant qu’aides visuelles que par la rigueur. Par exemple, supposons que l’on me donne une image du Golden Gate Bridge comme indiqué ci-dessous :

Figure 2 – Golden Gate Bridge

Bien que je sache que le pont réel, vu en personne, est beaucoup plus détaillé, ce que je vois ici est suffisant pour ses objectifs. Ainsi, la plupart des gens sont en fait prêts à sacrifier l’intégrité visuelle à la vitesse, tant que le compromis est acceptable. Par exemple, si la dégradation de la qualité visuelle subjective est de 1%, mais que l’utilisateur peut profiter d’un gain d’espace de 90%, il s’agit pour la plupart d’un échange bienvenu.

Donc, l’une des considérations clés dans la compression des bitmaps est d’optimiser l’indiscernabilité visuelle. C’est-à-dire, supprimer certains éléments d’une image où l’œil nu est incapable d’identifier la différence. C’est ce que l’on appelle la compression avec perte, qui constitue la plupart des types de compression que l’on voit sur les images en ligne dans les flux vidéo. C’est ainsi que fonctionnent les codecs H.264, HEVC, HEIF et JPEG.

Figure 3 – La compression d’image optimise l’indiscernabilité visuelle

D’autres types d’images comme le PNG sont compressés sans perte. L’idée est que l’on préserve toute l’intégrité visuelle de l’image originale mais en consommant moins d’octets pour représenter la même chose. Il existe encore d’autres formats de fichiers, comme WebP, qui prennent en charge la compression avec et sans perte. Pourquoi voulons-nous compresser les choses sans perte ? Comme ci-dessus, cela dépend de ce que nous voulons obtenir de l’image. Par exemple, les icônes dans les applis sont généralement en PNG (et récemment, en format graphique vectoriel).

La compression d’image sans perte consiste en une taille de fichier plus importante par opposition à la compression avec perte. La raison principale étant qu’il y a moins d’avenues pour compresser la première que la seconde. Pour les besoins de ce blog, nous parlerons de la compression avec perte.

Figure 4 – Un aperçu de la compression JPEG

Les étapes générales prises dans la compression JPEG est faite à ce jour dans la compression vidéo. Au fil des années, l’algorithme s’est amélioré mais les concepts généraux restent les mêmes.

Etape 1. Conversion de l’espace couleur

La conversion des images commence par la conversion du format d’image RVB brut en ses valeurs Chroma (r et b) et Luminance (Y). L’idée est que nos yeux sont plus sensibles aux changements de luminosité qu’aux couleurs. Par conséquent, nous sommes en mesure de sous-échantillonner la gamme de couleurs de l’image sans affecter sensiblement la qualité visuelle de l’image. Cela se fait par le biais du sous-échantillonnage chroma, comme expliqué ci-dessous.

Étape 2. Sous-échantillonnage chroma

De nombreux joueurs peuvent se rappeler que le sous-échantillonnage fait partie des boutons possibles qu’ils peuvent régler pour optimiser leur expérience de jeu. L’idée principale est que plus on fait de sous-échantillonnage, plus les performances du jeu sont rapides. Cela est dû au fait que le jeu nécessite moins de gamme de couleurs à rendre.

Le sous-échantillonnage des chromas est noté par J:a:b avec J étant le nombre de pixels à sous-échantillonner, a représentant les pixels de la ligne supérieure et b représentant les pixels de la ligne inférieure.

Figure 5 – Sous-échantillonnage chromatique

Dans le cas du 4:4:4, cela signifie que dans un 4×2 pixels, la première ligne (a) doit avoir 4 couleurs et la deuxième ligne aussi. Dans le cas de 4:2:2, cela signifie que dans un 4×2 pixels, la première ligne doit être représentée par deux couleurs et la deuxième ligne aussi. Dans le cas du 4:2:0, cela signifie que dans un 4×2 pixels, la première rangée doit être représentée par deux couleurs et la deuxième rangée copie sur ce qui est sur la première rangée.

Comme vous pouvez le voir. par le sous-échantillonnage chromatique, on est capable de réduire la gamme de couleurs jusqu’à 75%.

Étape 3. Transformée en cosinus discrète

La compression JPEG se fait en découpant l’image originale en morceaux de 8×8 pixels. Dans cette étape, nous attribuons des coefficients pour le morceau 8×8 en fonction des signaux présentés ci-dessous.

Figure 6 – Transformée en cosinus discrète (DCT). L’image de gauche est un signal de référence 8×8 utilisé pour jeter un poids sur l’image originale. L’image de droite est le chunk résultant après être passé par la DCT.

L’idée ici est que plus l’œil humain se déplace de la partie supérieure gauche de la référence DCT vers la partie inférieure droite, plus il est difficile à percevoir. Donc, généralement, ce qui se passe, c’est que lors de l’attribution des coefficients, la partie supérieure gauche obtient une valeur très élevée et elle diminue au fur et à mesure que l’on descend en diagonale.

Voici à quoi les choses pourraient ressembler en format numérique :

Figure 7 – Morceau original (gauche) Nouveau morceau après application de la TCD (droite)

STEP 4. Quantification

Après l’application de la DCT, l’étape suivante est appelée quantification. Ici, une table de quantification est appliquée aux valeurs DCT résultantes. La table diffère selon les algorithmes de compression et certains logiciels permettent à l’utilisateur de définir la quantité de quantification qu’il souhaite utiliser. Voici une table standard:

Figure 8 – Une table de quantification standard

Notez que les chiffres sont plus élevés à mesure que l’on va du haut à gauche vers le bas à droite. C’est intentionnel. L’idée de la quantification est que les données résultantes de la DCT sont divisées avec la table de quantification. C’est là que l’image comprimée perd une grande partie de ses données. Les chiffres en bas à droite étant élevés, la plupart de leurs valeurs deviendront nulles après la division. Voici à quoi cela pourrait ressembler :

Figure 9 – Table de quantification (gauche) Valeurs résultantes (droite)

STEP 5. Codage entropique à l’aide du codage de Huffman

Le codage de Huffman est la dernière étape de la compression. Voici comment il fonctionne.

Supposons que je veuille représenter une gamme de nombres en utilisant des bits. De plus, je veux les représenter de telle sorte que je consomme le moins de bits pour la représentation. La façon dont cela pourrait être fait est que les nombres très répétés reçoivent des bits inférieurs. Par exemple, si le zéro est souvent représenté, je lui attribue généralement des bits inférieurs. Une explication plus approfondie du codage de Huffman peut être trouvée ici.

L’idée ici est que vous utilisez moins de bits pour représenter un ensemble plus long de valeurs. Le codage de Huffman est un algorithme de compression sans perte qui est également utilisé dans la compression des fichiers texte. En faisant cela, il est possible d’économiser jusqu’à 50 % de la taille originale.

Qu’est-ce qui vient ensuite ?

La compression est simplement une partie de l’équation. Lorsque l’on doit rendre l’image, il faut inverser le processus de compression avant de pouvoir rendre l’image à l’écran.

Les JPEG sont en gros environ 90% plus petits que son homologue bitmap. À ce jour, c’est toujours le format de compression d’image le plus populaire disponible. Des algorithmes plus récents tels que HEIF (2013) et AVIF (2018) augmentent la gamme de pixels que l’on peut utiliser pour l’algorithme de compression.²

Malgré la popularité de JPEG, les nouveaux formats offrent une meilleure compression. WebP par exemple en général est environ 70% de la taille de JPEG et pourtant est encore capable de maintenir l’intégrité visuelle de l’image. C’est pourquoi Google (la société qui a développé WebP) a incité les développeurs à réencoder leurs images de JPEG en WebP. La prise en charge de WebP reste toutefois inférieure à celle de JPEG. D’où la nécessité de supporter les deux formats en conséquence.

¹ « Le format de fichier BMP. » Prépresse. Consulté le 19 avril 2019. https://www.prepressure.com/library/file-formats/bmp.

² Netflix a publié le premier ensemble d’images AVIF en 2018. À la date de ce post, les images sont toujours accessibles ici. Des entreprises telles que Firefox et Microsoft prendront bientôt en charge cette image dans leurs offres logicielles.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.