Allez, on s’y colle !Le JPEG pour les nuls, tu le crois ?
par Gilou - 01/06/02
Bon, nous ne sommes pas des programmeurs, pas question de faire son encodage soit même, c’est juste histoire de comprendre un peu comment ça marche, puisque c’est la base du codage MJPEG A et B, du DV etc….
Comme c’est une histoire de matheux, ça apparaît d’abord, indigeste au possible. Mais pour une fois, sauf si vous avez un niveau scolaire qui s’arrêt au CP, et un QI de 10 (ou moins, mais là, vous ne liriez pas ça…), je vais essayer de vous expliquer comment une image qui sort du scanneur, recalibrée à 1,27 Mo (format TV, 768 x 576 sous Photoshop pour faire un menu de DVD par exemple) peut passer à 80 Ko par la magie de l’encodage JPEG.
Bon, ce cas est assez caricatural, parce que là…. La définition de l’image en a vraiment pris un coup….
READY ? Parce que là, vous allez aussi savoir, pourquoi nous affirmons que les images doivent avoir, avant codage (DivX, DV, toutes…) des dimensions multiples de 16….
Je me marre à l’avance, parce que tout le principe est basé sur un multiple de 8, pas 16, mais bon ! soluce après l’aspirine ou 10 pastis…
On va commencer simple, vous avez déjà entendu parler des TdF ?
Mais non, pas TéléDiffusion de France !Ce sont les Transformées de Fourrier ;-)
Fourrier, c’est un matheux qui a démontré qu’une forme d’onde compliquée pouvait se traduire (ou être reconstituée, si vous préférez) par la somme de plusieurs fréquences élémentaires, pures (sinusoïdales quoi !). D’ailleurs, ce fut la base des premiers synthétiseurs audio.
De là à l’appliquer à un paquet de pixels, il n’y avait qu’un pas que les membres du Joint Photographic Expert Group (le fameux JPEG donc) ont fait.
Je ne vais pas vous embrouiller avec une quelconque démonstration théorique, mais j’attaque directement avec une image de 2 x 2 pixels.
Évidemment, on va raisonner en noir et blanc, et quand il y aura de la couleur, on multipliera simplement les manips, à quelques nuances près.Voici matérialisés les 4 pixels de notre image, à qui je vais associer 4 motifs :
En fait, les 4 motifs représentent chacun une part des 4 pixels et vont être utilisés pour les décrire séparément, mais complémentairement.
C’est incompréhensible, je sais ! mais je vais prendre un exemple plus concret..
Si on superpose les 4 motifs comme des calques plus ou moins transparents (dans Photoshop par exemple), on peut obtenir ces nouvelles images :
Elles sont bien différentes, et pourtant, elles ont été faites avec les mêmes motifs, il a suffi simplement d’en changer la valeur de transparence.
Vous allez me dire que, au lieu de décrire 4 pixels séparément, j’ai décris 4 motifs ! Quel intérêt puisque ça fait autant d’information ?
C’est simple, la deuxième image n’utilise pas le motif n°4, dont je ne le décris pas, et par conséquent, j’économise une information, j’ai donc gagné 25 % du poids de l’image.
Bluffé ? T’as pas fini, mon pote ;-))))
Bon, restons sérieux, mais on reste quand même à 4 pixels, pour continuer l’explication.
Les 4 motifs, pour êtres réellement exploitables, doivent pouvoir prendre une valeur de –100% à +100%. Ca veut dire quoi ?
Pour le motif 1 par exemple (les 4 pixels en bloc) ça peut être tout noir, ou tout blanc, ou pas du tout utilisé... avec toutes les nuances intermédiaires, bien sûr ! En fait, c’est un peu comme au labo photo (c’était le bon temps…), -100% c’est le négatif, +100% c’est le positif, et 0%, c’est totalement transparent (donc ça ne compte pas…)Pour ceux qui n’ont pas compris, je rajoute les variantes :
+100%
-100%
0%
…transparent n’est-ce pas ?
On continue, mais en vrai, avec des vrais motifs !
Il y en a 64 (8 x 8, étonnant non ?) et je me suis fais un C.. à vous les faire, j’espère que vous apprécierez.
Et à ces motifs, on associe une table de 64 valeurs, qui se crée et se lit en diagonale (comme le montre la flèche) et va constituer la description du bloc de pixels, avec une complexité croissante.
Deux exemples simples : si on superpose les 8 motifs de la première ligne, on obtient une ligne blanche à gauche du bloc. Si on rajoute les motifs de la première colonne, on isole le pixel en haut à gauche.
On peut donc varier les combinaisons de multiples façons, avec des valeurs de transparence variant pour chaque motif, et c’est maintenant qu’on va faire intervenir la notion de qualité liée à la compression.
En effet, si certains motifs ne sont pas utilisés, c’est une chose que de ne pas les décrire, mais on peut faire mieux en décidant que : tant que la valeur associée à un motif n’est pas suffisamment significative, on considère qu’elle est nulle, donc on l’ignore. C’est ce seuil que l’on fait varier quand on décide de la qualité (ou de la compression) de l’image.
Seuil élevé = manque de subtilité dans les détails, voire « pixelisation », mais forte compression
Seuil bas = restitution quasi parfaite, mais faible compression.
Donc en théorie, on peut arriver à un taux maxi de compression de 64, en ne gardant qu’un seul motif faisant la moyenne, pour un groupe de 8 x 8 pixels.
En réalité, on en est très loin, on approche un rapport de 16 : 1 au mieux (au pire pour l’image), car dans tous les cas la table des motifs utilisés est décrite intégralement dans le fichier jpeg (ça en fait des octets..). Et contrairement à ce que j’ai affirmé auparavant, toutes les valeurs de motif sont décrites, mais avec un système de codage très puissant, appelé codage de Huffman, qui permet de « raccourcir » le nombre de bits pour ce faire.
Sans rentrer dans les détails, je vais vous donner un exemple : Admettons que l’image soit uniforme (un noir par exemple, pendant une transition entre 2 plans dans un film). Seul le premier motif est représentatif du bloc de 8 x 8. On va donc lui attribuer une valeur qui tiendra en un octet, soit 8 bits. Tous les autres motifs sont à 0 (zéro), dans ce cas-là, chaque motif est décrit sur un seul bit au lieu de 8, soit 63 en plus, donc 8 octets pour ces derniers, 9 en tout.
C’est forcément mieux que 64 octets, mais ça fait un taux de compression de 7 seulement. On est donc loin des 64 évoqués…
Evidemment, cet article n’est pas exhaustif, il y a beaucoup d’autres finesses qui augmentent encore la compression dans l’encodage JPEG, mais j’espère que ça vous aura éclairé un peu.
La cerise sur le gâteau : Pourquoi les dimensions des images vidéo doivent-elles être un multiple de 16 et pas de 8 ?
Parce que la définition des couleurs (la chrominance) est deux fois moindre que la définition de la luminance, du moins pour la vidéo numérique. Une information de couleur concerne 4 pixels, et comme le codage est le même, il faut 16 x 16 pixels pour avoir 8 x 8 informations de couleur. CQFD
Pour éclairer ces notions de luminance / chrominance, je vous invite à lire le dossier sur les pixels, c'est expliqué là mais pour faire la relation avec ce que l'on connait, la luminance, c'est le "côté" noir et blanc de l'image, qui passe dans le fil Y, et la chrominance, ce sont les informations de couleur qui passent sur le fil C d'un câble Y/C, également appelé S-Vidéo.