Formats d'image: WebP

À l'origine, Google a développé WebP en tant que format d'image avec pertes pour remplacer JPEG, un format capable de produire des fichiers plus petits qu'un fichier image de qualité comparable encodé au format JPEG. Des mises à jour ultérieures du format ont introduit l'option de compression sans perte, de transparence du canal alpha de type PNG et d'animation de type GIF, qui peuvent toutes être utilisées avec la compression avec pertes de style JPEG. WebP est un format incroyablement polyvalent.

L'algorithme de compression avec pertes de WebP se base sur une méthode utilisée par le codec vidéo VP8 pour compresser les images clés dans les vidéos. De manière générale, il est semblable à l'encodage JPEG: WebP fonctionne en termes de "blocs" plutôt qu'en termes de pixels individuels, et présente une division similaire entre la luminance et la chrominance. Les blocs de luma de WebP sont de 16x16, tandis que les blocs de chrominiques sont de 8x8 et ces "macroblocks" sont subdivisés en sous-blocs 4x4.

Les différences radicales entre WebP et le JPEG se trouvent dans deux domaines : la "prédiction par blocs" et la "quantification par bloc adaptative".

Prédiction par blocs

La prédiction par bloc est le processus par lequel le contenu de chaque bloc de chrominance et de luminance est prédit en fonction des valeurs des blocs qui les entourent, en particulier les blocs situés au-dessus et à gauche du bloc actuel. Comme vous pouvez l'imaginer, les algorithmes qui effectuent ce travail sont assez complexes, mais pour simplifier, "s'il y a du bleu au-dessus du bloc actuel et du bleu à gauche du bloc actuel, supposons que ce bloc est bleu."

En réalité, les fichiers PNG et JPEG effectuent également ce genre de prédiction dans une certaine mesure. Cependant, WebP est unique dans la mesure où il échantillonne les données des blocs environnants, puis tente de renseigner le bloc actuel à l'aide de plusieurs "modes de prédiction", en essayant de "dessiner" la partie manquante de l'image. Les résultats fournis par chaque mode de prédiction sont ensuite comparés aux données d'image réelles, et la correspondance prédictive la plus proche est sélectionnée.

Schéma des différentes méthodes WebP de prédiction de blocs.

Bien entendu, même la correspondance prédictive la plus proche ne sera pas tout à fait correcte. Les différences entre les valeurs prédites et réelles de ce bloc sont donc encodées dans le fichier. Lors du décodage de l'image, le moteur de rendu utilise les mêmes données pour appliquer la même logique prédictive, ce qui permet d'obtenir les mêmes valeurs prédites pour chaque bloc. La différence entre la prédiction et l'image attendue qui a été encodée dans le fichier est ensuite appliquée aux prédictions. De la même manière qu'un commit Git représente un correctif différentiel appliqué au fichier local, plutôt qu'une toute nouvelle copie du fichier.

Par exemple, plutôt que d'approfondir les calculs complexes liés à un véritable algorithme prédictif, nous allons inventer un encodage de type WebP avec un mode de prédiction unique, et nous l'utiliserons pour transmettre efficacement une grille de chiffres comme nous le faisions avec les anciens formats. Notre algorithme comporte un seul mode de prédiction, que nous appellerons "mode de prédiction 1". La valeur de chaque bloc est la somme des valeurs des blocs situés au-dessus et des blocs situés à gauche, en commençant par 1.

À présent, supposons que nous commencions avec les données d'images réelles suivantes:

111151111
122456389

En utilisant notre modèle prédictif pour déterminer le contenu d'une grille de 2x9, nous obtenons le résultat suivant:

111111111
123456789

Nos données sont adaptées à l'algorithme prédictif que nous avons inventé. Les données prédites correspondent étroitement à nos données réelles. Bien sûr, ce n'est pas une adéquation parfaite. Les données réelles comportent plusieurs blocs différents des données prédites. Ainsi, l'encodage que nous envoyons n'inclut pas seulement la méthode de prédiction à utiliser, mais également les différences des blocs qui doivent différer de leurs valeurs prédites:

_ _ _ _ +4 _ _ _ _
_ _ -1 _ _ _ -4 _ _

Utilisez le même type de langage simple que certains des anciens encodages de format dont nous avons parlé:

Grille 2x9 utilisant le mode de prédiction 1. +4 à 1 x 5, -1 à 2 x 3, -4 à 2 x 7.

Le résultat final est un fichier encodé incroyablement efficace.

Quantification de blocs adaptative

La compression JPEG est une opération globale, qui applique le même niveau de quantification à chaque bloc de l'image. Dans une image à la composition uniforme, cela a certainement du sens, mais les photographies du monde réel ne sont pas plus uniformes que le monde qui nous entoure. En pratique, cela signifie que nos paramètres de compression JPEG ne sont pas déterminés par les détails de haute fréquence, où la compression JPEG excelle, mais par les parties de notre image où des artefacts de compression sont les plus susceptibles d'apparaître.

Image JPEG compressée d'un papillon monarque

Comme vous pouvez le voir dans cet exemple exagéré, les ailes du monarque au premier plan sont relativement nettes. Elles sont un peu granuleuses par rapport à l'original en haute résolution, mais ne seront certainement pas visibles si l'original n'est pas comparable. De même, l'inflorescence détaillée de l'asclépiade et les feuilles au premier plan (vous et moi pouvons voir des traces d'artefacts de compression avec nos yeux entraînés, mais même avec la compression bien au-delà des niveaux raisonnables, les éléments de premier plan semblent encore nettoyés). Les informations sur les basses fréquences en haut à gauche de l'image (le fond vert flou de feuilles de feuilles) a l'air terrible. Même un spectateur non entraîné remarquerait immédiatement le problème de qualité : les dégradés subtils en arrière-plan sont arrondis à des blocs de couleur unie et irrégulières.

Pour éviter cela, WebP adopte une approche adaptative de la quantification: une image est divisée en quatre segments visuellement similaires et les paramètres de compression de ces segments sont réglés indépendamment. Utiliser la même compression de taille importante avec WebP:

Image WebP compressée d'un papillon monarque

La taille de ces deux fichiers image est à peu près identique. La qualité est à peu près la même lorsque nous observons les ailes du monarque. Vous pouvez repérer quelques petites différences dans le résultat final si vous regardez de très près, sans véritable différence de qualité globale. Dans la version WebP, les fleurs de l'ascension sont simplement un peu tranchantes. Là encore, elles ne seront probablement pas assez visibles si vous ne comparez les deux côtés et recherchez vraiment les différences de qualité, comme nous le sommes. Le contexte est complètement différent: il présente à peine une trace des artefacts du JPEG évident. WebP nous donne la même taille de fichier, mais une image de bien meilleure qualité. Apportez ou prenez quelques petits détails que nos systèmes psychovisuels ne pourraient pas détecter si nous ne les comparions pas aussi étroitement.

Utiliser WebP

Les caractéristiques internes de WebP peuvent être considérablement plus complexes que l'encodage JPEG, mais tout aussi simples pour les besoins de notre travail quotidien: toute la complexité de l'encodage WebP est standardisée autour d'une seule valeur de "qualité", exprimée entre 0 et 100, tout comme JPEG. Encore une fois, cela ne signifie pas que vous êtes limité à un seul paramètre de "qualité". Vous pouvez (et devez) vous familiariser avec tous les détails de l'encodage WebP, ne serait-ce que pour mieux comprendre l'impact de ces paramètres normalement invisibles sur la taille et la qualité des fichiers.

Google propose un encodeur de ligne de commande cwebp qui vous permet de convertir ou de compresser des fichiers individuels ou des répertoires entiers d'images:

$ cwebp -q 80 butterfly.jpg -o butterfly.webp

Saving file 'butterfly.webp'
File:   butterfly.jpg
Dimension: 1676 x 1418
Output: 208418 bytes Y-U-V-All-PSNR 41.00 43.99 44.95   41.87 dB
        (0.70 bpp)
block count:    intra4:     7644  (81.80%)
               Intra16:     1701  (18.20%)
               Skipped:       63  (0.67%)
bytes used:  header:            249  (0.1%)
              mode-partition:  36885  (17.7%)
Residuals bytes  |segment 1|segment 2|segment 3|segment 4|  total
macroblocks:     |       8%|      22%|      26%|      44%|   9345
quantizer:       |      27 |      25 |      21 |      13 |
filter level:    |       8 |       6 |      19 |      16 |

Et si vous n'êtes pas plutôt orienté vers la ligne de commande, Squoosh nous sera tout aussi utile pour encoder le WebP. Il nous permet de comparer côte à côte différents encodages, paramètres, niveaux de qualité et différences de taille de fichier par rapport à l'encodage JPEG.