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.
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 :
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.
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.
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.
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.
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 :