Jump to: navigation, search

Compression d'images

Cette page présente quelques algorithmes courants de compression d'images.

Pourquoi compresser?

Pour comprendre en quoi la compression des images est nécessaire en informatique , nous allons faire un rapide retour sur la structure d'une image numérique[1].

Une image en informatique est une liste de pixels stockée en 1 dimension et lue bloc par bloc pour en faire une surface.

Sur le disque dur, une image est organisée comme ceci:

Image-data-model-memory.png

Les premiers bytes du fichiers contiennent un manuel d'utilisation, expliquant quelles sont ses dimensions, l'emplacement des différentes zones de mémoires et éventuellement une signature caractéristique du type de compression (codec) utilisée. Les bytes qui suivent contiennent les informations de couleur qui permettront d'allumer les pixels de l'écran. La tâche d'un logiciel d'affichage et/ou de traitement d'image est de lire le manuel et de convertir les informations en une grille de pixels. Après cette opération, l'image est affichable sur un écran 2D[2].

Image-data-model-onscreen.png

Le stockage de chaque pixel dans une liste occupe beaucoup de place en mémoire. Pour pouvoir visualiser et manipuler l'image, il est courant de la décompresser dans la RAM. Cette mémoire étant optimisée pour cet usage (l'accès en lecture et en écriture est très rapide), elle permet de manipuler les images sans qu'elles soient compressées. Sa capacité est par contre beaucoup plus réduite que celle des disques durs, et elle se remplit très vite puisqu'elle utilise les fichiers non compressés.

Le stocakge en ROM n'a pas les mêmes performance que la RAM. La ROM est lente mais par contre permet de stocker de grosses quantité de données. C'est en grande majorité pour améliorer ROM que la compression a été mise au point en image.

  • Son premier rôle est de réduire la quantité de mémoire utilisée pour un fichier. Si une compression diminue par 10 le poids des fichiers sur le disque dur, il pourrat donc en contenir 10x plus!
  • Son deuxième rôle est d'accélérer l'accès au fichier. En comparaison de la RAM, un disque dur est lent en lecture. Si un fichier compressé contient 10x moins d'informations que son équivalent non-compressé, la lecture de ses informations sera plus rapide. Le facteur 10 n'est pas nécessairement vrai ici. Dans le cas de petits fichiers, la différence n'est pas aussi marquante puisqu'il faut ajouter au temps de lecture le temps que l'OS prend à le retrouver dans le disque.

Types de compression

Il existe de multiple manière d'enlver de l'ormation dans un fichier, avec ou sans perte d'information.

Lossy

Lossy (avec perte) désigne toutes compression impliquant qu'un fichier, une fois compressé, ne permet plus de retrouver les valeurs exactes de l'original. La compression se fait en oubliant un certain nombre d'informations jugées non-cruciales pour la diffusion de l'image. Ces compressions sont les plus répandues dans le grand public parce qu'elles permettent des gains substantiels en vitesse de transfert et poids de fichier. Elle sont par contre à éviter dans une chaîne graphique car les compressions font perdre de manière irrémédiable de l'information à chaque sauvegarde.

Les schémas ci-dessous explique deux approches différentes avec perte d'information: celle du GIF[3] et celle du JPEG[4].

GIF

La compression utilisée dans les GIF est une des plus simple à comprendre et se base sur le même principe que les images à colorier.

  • On définit une palette de couleurs numérotées à utiliser.
  • On retire l'information de couleur des pixels et on la remplace par un nombre correspondant à la couleur de la palette.


Image-data-model-palette compression.png

Le choix des couleurs est déterminant pour conserver l'aspect général de l'image. Les dégradés sont typiquement évacuées au profit de plage de couleurs unies. Le poids du fichier est fortement diminué: d'un fichier contenant 16 blocs de 24 bits, on passe à un fichier ne contenant plus que 4 blocs de 24 bits et 16 blocs de 2 bits dans ce cas. Les blocs de 2 bits sont les pixels, contenant un nombre de 0 à 4, permettant de retrouver la bonne couleur à appliquer.

JPEG

Le format JPEG n'utilise pas ce système de palette de couleur. Il se base sur un algorithme beaucoup plus subtil qui consiste à identifier des fréquences auxquelles sont sensibles les humains dans l'image. Les fréquences basses (difficilement identifiables, comme des détails dans les zones sombres) seront évacuées en premier. La compression se fait spatialement, en découpant l'image selon une grille qui se raffine en fonction des fréquences identifiées dans chaque zone. Si une zone a peu de détails perceptibles (comme un ciel bleu sans nuages), une seule valeur RGB sera utilisée pour la zone. Au contraire, un panier remplit de billes colorées sera beaucoup plus subdivisé pour conserver un maximum de détails.

Une fois compressée en JPEG, notre image test aura perdu des détails dans les zones peu contrastées, alors que d'autres seront restées très définies.

Image-data-model-spacial compression.png

Que ce soit à la compression ou à la décompression, une grille d'ondelettes est appliquée sur chaque zone de l'image, définissant le besoin de définition de chacune.

DCT-8x8.png

Grille de fréquences 2d utilisée par l'algorithme JPG[5].

Lossless

Lossless (sans perte) désigne toutes les compressions qui permettent de retrouver l'image originale une le fichier décompressé. Cette capacité implique malheureusement le stockage de beaucoup plus d'informations que dans les compression lossy, et induit donc des fichiers plus lourds et donc plus lents à échanger ou à ouvrir.

Fichiers de travail

Ici nous ne parlerons pas de compression mais de format La plupart des formats de travails permettent de choisir l'algorithme de compression utilisé dans le fichier. Ces formats sont difficilement échangeables en réseau car ils modifient très peu la taille des fichiers originaux et sont donc très lourds.

La meilleure manière de ne perdre aucune information des pixels de l'image est de les stocker tels quels sur le disque dur, en utilisant aucune compression ou optimisation. On parle alors de fichiers RAW en anglais, ou bruts. Ils sont les plus lourds et les plus lents à s'ouvrir.

Un des formats les plus anciens est le BMP[6]. Utilisé sans compression, le format BMP revient à stocker les pixels les uns après les autres comme dans le schéma ci-dessus. Cette simplicité de fonctionnement lui permet d'accepter différentes profondeur de couleurs (de 4bits par canal à 10bits par canal).

Un autre format très répandu dans l'industrie graphique en europe est le TIFF, Tagged Image File Format[7]. Il n'impose pas de compresser, permet l'utilisation de plusieurs algorithmes de compression et supporte de nombreux types d'encodage des couleurs: RGB, CMYK et LAB entre autres.

Diffusion

Les formats de difusion sans perte sont plus rares.

Un des plus utilisé est le PNG, Portable Network Graphics[8]. En plus de sa fidélité à l'image source, il permet de stocker la transparence dans un canal. Il supporte que les couleurs RGB et en valeur de gris. Le PNG apparait en 1995 et est rapidement adopté car il surpasse le GIF dans de nombreux dommaines, et évite les artefacts du JPEG. Il peut être utilisé comme format de travail puisqu'il ne se dégrade pas au fur et à mesure des sauvegardes.

Bien qu'apparu en 2010, le Webp, Web Picture[9], est encore relativement peu connu du grand public. Développé par Google, ce format permet d'utiliser aussi bien des compressions lossy que lossless.

Un tout nouveau format libre, le FLIF, Free Lossless Image Format[10] est apparu en 2015. Il annonce de meilleures performances que ces compétiteurs. Encore très jeune, le format n'est pas encore intégré dans les principaux outils graphiques.

Coût de la compression

Comme nous l'avons vu jusqu'ici. la compression permet d'accélérer l'accès aux fichiers et d'améliorer la capacité de stockage des disques durs et autres clés USB.

Ce gain de place et de vitesse a un coût difficile à identifier de prime abord. La compression des informations nécessite d'analyser les images de manière complexes pour soit éviter de stocker deux fois la même informations soit rechercher les parties d'images les plus signifiantes. La décompression, en général moins compliquée, consiste à recréer tous les pixles sur base des informations contenues dans le fichier. Ces 2 tâches sont effectuées par le CPU.

Il est donc important de prendre en compte sa puissance quand il s'agit de choisir telle ou telle compression. Au plus le fichier est léger, au plus intense sera l'effort du processeur. Le cas le plus courant est le visionnage d'un film sur un ordinateur bas de gamme. Le fichier le plus léger ne sera pas nécessairement le meilleur choix pour assurer une lecture fluide. Un fichier moins compressé et donc plus lourd demandant moins de travail au CPU permettra lui d'assurer la fluidité de la lecture.

Comparaison

Le choix de telle ou telle compression n'est pas uniquement dicté par le poids du fichier. Les compressions lossy ont des foces et des faiblesses en fonction du type d'images. Les deux chapitres ci-dessous présentent la compression GIF et la compression JPEG appliquée à une photographie et à une image graphique.

Dégradation suite à des compression fortes:

Original JPEG 20% GIF 12 couleurs
Compressions-comparaison.png

La partie de droite des images ci-dessous permet de visualiser la différence entre la compression et l'image originale. Le poids de l'image et le facteur de compression est indiqué au-dessus de chaque compression.

Photos

  • original, 417.2 kB

Flag-Of-Palestine-Arab-Man-Waving-1081797.jpg

PNG

  • 1.9 MB

Flag-Of-Palestine-Arab-Man-Waving-1081797 png.png

JPEG

Le JPEG utilise une compression spaciale des informations de l'image.

  • qualité à 60% - 163 kB

Flag-Of-Palestine-Arab-Man-Waving-1081797 60pc-delta.jpg

  • qualité à 40% - 157.5 kB

Flag-Of-Palestine-Arab-Man-Waving-1081797 40pc-delta.jpg

  • qualité à 20% - 140.8 kB

Flag-Of-Palestine-Arab-Man-Waving-1081797 20pc-delta.jpg

  • qualité à 3% - 73.2 kB

Flag-Of-Palestine-Arab-Man-Waving-1081797 01pc-delta.jpg

GIF

  • palette de 256 couleurs - 1.1 MB

Flag-Of-Palestine-Arab-Man-Waving-1081797 256palette-delta.jpg

  • palette de 102 couleurs - 970.7 kB

Flag-Of-Palestine-Arab-Man-Waving-1081797 102palette-delta.jpg

  • palette de 12 couleurs - 651.9 kB

Flag-Of-Palestine-Arab-Man-Waving-1081797 12palette-delta.jpg

Graphique

  • original, 30.3 kB

Godot logo.png

JPEG

  • qualité à 60% - 14.5kB

Godot logo 60pc jpg.png

  • cqualité à 20% - 11,3kB

Godot logo 20pc jpg.png

  • qualité à 3% - 5.6kB

Godot logo 03pc jpg.png

GIF

  • palette de 20 couleurs - 40.1kB

Godot logo 20palette gif.png

  • palette de 5 couleurs - 37.3kB

Godot logo 5palette gif.png

  • palette de 20 couleurs - 21.2kB

Godot logo 2palette gif.png

En complément

Références

  1. Les notions fondamentales relatives à l'image en informatique sont expliquées sur cette page: les unités en informatique, le pixel .
  2. Les informations stockées dans une image sur le disque ne sont en rien différentes de celle d'un fichier son, d'une vidéo, d'un programme ou d'un driver. C'est ce header et/ou à l'extension de fichier qui vont permettre de lire correctement un fichier.
  3. GIF: Graphics Interchange Format, voir wikipedia.
  4. JPEG: Joint Photographic Experts Group, voir wikipedia.
  5. Pour comprendre l'utilisation de la grille de fréquences DCT du JPEG, voir wikipedia
  6. BMP, BMP file format, voir wikipedia:BMP
  7. TIFF, Tagged Image File Format, voir wikipedia:TIFF
  8. PNG, Portable Network Graphics, voir wikipedia
  9. Webp, Web Picture, voir wikipedia
  10. FLIF, Free Lossless Image Format, voir wikipedia