Codage JPEG et transformation en cosinus discrète
Ce petit programme a été conçu pour illustrer la conférence Traitement numérique de l'image. Son but est de mettre en évidence le principe de la transformation en cosinus discrète (en anglais : Discrete Cosine Transform, abrégé en DCT), utilisée dans le codage JPEG des images.
Principe de la DCT
Nous supposons ici que l'image à coder est en niveaux de gris : il suffit donc de donner l'intensité de chaque pixel. Dans le codage JPEG, l'image est d'abord découpée en blocs de 8X8 pixels. À chacun de ces blocs est ensuite appliquée une transformation en cosinus discrète reposant sur la décomposition de ce bloc sur une base particulière.
Chaque bloc 8X8 de l'image est vu comme une fonction F de {0,...,7} X {0,...,7} dans R, qui au pixel de coordonnées (x,y) associe l'intensité de ce pixel. L'ensemble de ces fonctions constitue un espace vectoriel sur R de dimension 64, et on le munit du produit scalaire <F,G> = F(0,0)G(0,0)+...+F(7,7)G(7,7). La base de fonctions utilisées pour le codage JPEG est formée par une famille orthonormale pour ce produit scalaire. Ce sont les fonctions Fu,v définies par Fu,v(x,y) = N(u)N(v) cos(2x+1)uπ/16 cos(2y+1)vπ/16, où N(u) et N(v) sont des constantes de normalisation.
La décomposition du bloc à coder peut donc s'écrire F = c0,0 F0,0 + ... + c7,7 F7,7, où les coefficients cu,v sont les produits scalaires de F avec les fonctions Fu,v. On peut donc remplacer la donnée des intensités F(x,y) par celle des coefficients cu,v : ils contiennent exactement la même information. Ce passage des intensités aux coefficients cu,v est précisément ce que l'on appelle la transformation en cosinus discrète.
Ce que fait le programme
Avec le programme présenté ici, on peut expérimenter la reconstruction d'un bloc de l'image à partir des coefficients cu,v. La plus grande des trois fenêtres ouvertes par le programme, qui porte le titre «base DCT», présente les 64 fonctions Fu,v qui forment la base utilisée. On peut sélectionner ou désélectionner les coefficients correspondants en cliquant avec le bouton de gauche dans cette fenêtre : les Fu,v sélectionnés sont entourés de rouge. Le bouton du milieu permet de sélectionner tout ; celui de droite désélectionne tout. La fenêtre «image» montre un bloc de l'image à coder. La fenêtre «approche» montre le résultat obtenu lorsque, pour reconstituer ce bloc, on n'utilise que les coefficients cu,v sélectionnés.
L'idée de la compression JPEG
La substitution de la donnée des 64 intensités par celle des 64 coefficients ne serait pas très avantageuse... L'intérêt d'être passé à la DCT réside dans le fait que, en général, certains des coefficients cu,v sont moins importants que d'autres : on peut donc les «oublier» (alors qu'on ne peut pas aussi facilement oublier de donner des intensités : ça ferait des trous dans l'image !). On peut ainsi remarquer qu'en général, les coefficients cu,v pour u et v «grands» (le coin en bas à droite de la fenêtre «base DCT») n'ont qu'une faible importance. Au contraire, l'utilisation de seulement quelques coefficients en haut à gauche (u et v «petits») donne déjà une bonne idée du bloc codé. La compression JPEG utilise ce principe : n'utiliser qu'une partie bien choisie de l'information contenue dans les coefficients de la DCT afin de coder l'image. Il s'agit donc d'une compression avec perte : certains coefficients sont complètement (ou en partie) négligés.
Comment installer ce programme sur un système GNU/Linux
La compilation de ce programme nécessite :
- Le compilateur gcc,
- GTK+1.2.
Commencer par télécharger l'archive tar compressée. Se placer dans le répertoire où l'archive a été enregistrée, et extraire cette archive par tar xvjf jpeg.tar.bz2[ENTRÉE] Aller dans le sous-répertoire JPEG ainsi créé : cd JPEG[Entrée] puis taper make[Entrée] Vous devriez alors disposer du fichier exécutable «jpeg». Dans le répertoire JPEG, tapez ./jpeg&[Entrée] et ça doit marcher !


