« Compression de données/Le format JPEG 2000 » : différence entre les versions

Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Ligne 2 :
 
== Aperçu ==
Le format [[:w:JPEG|JPEG]] figure en tête du hit-parade des formats d'images, accompagné par l'équivalent non- destructif, le PNG. Malgré sa grande popularité, il n'est pas exempt de défauts et les spécialistes se sont penchés sur ses problèmes pour concevoir son successeur : le [[:w:JPEG 2000|JPEG 2000]]. Cet article devrait vous permettre de mieux cerner les algorithmes utilisés par ce format récent. Il doit encore s'imposer sur le web grâce aux navigateurs populaires qui ne l'intègrent pas encore. L'utilisation par le grand public reste donc marginale malgré un nombre croissant d'applications qui permettent de travailler avec ce format.
 
== Introduction ==
Ligne 20 :
# Implémentations de référence (JJ2000 et Jasper)
# Format JPM (format "compound" pour intégrer du texte, des images,...)
# Spécifications pour appareils à puissance limitée (partie abandonnée et non- publiée)
# Sécurité, intégrité, authenticité et cryptage (JPSEC)
# Protocole client-serveur JPIP (utilisation du format dans un réseau)
Ligne 52 :
En améliorant le concept de découpage du signal déjà présent dans la STFT, les ondelettes offrent une alternative séduisante. Contrairement au STFT, les ondelettes permettent de travailler avec des segments de tailles différentes, on parle alors plutôt d'échelle. En variant l'échelle utilisée pour analyser le signal, on pourra se concentrer sur une bande bien précise de fréquences. Ce type d'analyse propose un compromis entre la précision temporelle et fréquentielle.
 
Par exemple, une haute fréquence pourra facilement être localisée dans le temps, mais il sera difficile d'établir sa fréquence exacte. Avec un signal basse fréquence, c'est exactement l'inverse. Nous pourrons déterminer avec une assez grande précision la valeur de la fréquence, mais nous ne pourrons pas très bien la situer dans le temps. Ceci est assez logique, un signal à haute fréquence effectue une période sur un laps de temps très court. On peut ainsi facilement détecter un "pic" mais, comme sa longueur est limitée, la précision pour résoudre la fréquence est faible. Une basse fréquence s'étalera sur une plus longue période. Comme la fenêtre considérée est plus longue, on disposera de plus d'informations sur le signal et l'appréciation de la fréquence sera améliorée au détriment de la résolution dans le temps. Ces problèmes sont inhérents à la définition d'un signal et on ne peut pas totalement les éviter ([[:w:Principe d'incertitude|incertitude d'Heisenberg]]).
 
Une autre grande différence entre les ondelettes et la famille Fourier est l'utilisation de fonctions autres que sinusoïdales. Le terme d'ondelette se réfère en fait à la fonction utilisée pour décomposer le signal. Dans le cas du Fourier, l'ondelette est un sinus. Le JPEG2000 utilise une ondelette de type Daubechies, nous y reviendrons plus tard.
Ligne 76 :
Quel est l'intéret d'une telle transformation ? Un signal transformé se compressera mieux que le signal brut, on parle de compression d'énergie. Les coefficients de détails ont souvent une magnitude inférieure aux échantillons du signal original. On a donc besoin de moins de bits pour coder ces informations et nous pouvons réduire leur précision. Si nous reconstruisons le signal comme nous l'avons fait précédemment à partir de <math>[12,7, -8, 0]</math>, nous obtenons <math>[4, 20, 7, 7]</math>. Le signal est dégradé mais encore fidèle à l'original.
 
Nous venons d'effectuer une première passe de l'algorithme. Nous allons maintenant affiner l'analyse en diminuant l'échelle. Nous reprenons la séquence issue de la première transformation, soit <math>S1 = [12, 7, -11, 2]</math>. Nous avons vu que la première partie correspond aux coefficients "basses fréquences" et la deuxième partie aux coefficients de détails. Nous allons maintenant appliquer l'algorithme récursivement sur la partie de gauche (basse fréquence). AÀ partir de S1, nous prenons <math>[12, 7]</math> et trouvons la moyenne suivante : <math>(12+7)/2 = 9,5</math>. Le coefficient de détail pour cette partie correspond à <math>(12-9,5) = 2,5</math>. Nous remplaçons les termes présents dans la partie gauche de S1 par ceux que nous venons de calculer. Nous obtenons ainsi <math>S2 = [9,5, 2,5, -11, 2]</math> constitué d'un coefficient d'approximation et de 3 coefficients de détails. Nous ne pouvons pas décomposer davantage la partie basse fréquence car elle se réduit maintenant à un seul terme.
 
Tentons une reconstitution du signal S depuis S2. Nous commençons à partir du coefficient d'approximation qui vaut 9,5. Grâce aux informations de détails qui suivent ce coefficient, nous pouvons aisément retrouver les éléments de S1 : <math>(9,5+2,5)</math> et <math>(9,5-2,5)</math>. Nous avons bien <math>[12, 7]</math>. En appliquant la transformation pour passer de S1 à S comme décrit précédemment, nous retrouvons le signal sans dégradation.
Ligne 84 :
== La transformation de Haar sur une image ==
[[Image:Jpeg2000 wikibooks img4.png|thumb|right|À gauche, une transformation rectangulaire. À droite, une transformation carrée ou dyadique.]]
Prenons une image de 64x64 pixels. Nous isolons les 64 lignes de l'image et appliquons une transformation de Haar complète sur chacune d'entre elles. Pour chaque ligne, le résultat est composé d'un coefficient d'approximation suivi de 63 coefficients de détails. Les lignes transformées sont assemblées pour former une nouvelle image et il s'ensuit une transformation de Haar verticale, cette fois-ci sur les colonnes. AÀ la fin, le premier élément de la matrice en haut à gauche correspond au coefficient d'approximation pour toute l'image (l'intensité moyenne de l'image). Le reste de la matrice correspond aux coefficients de détails pour différentes échelles. On procède de la manière inverse pour reconstituer l'image avec une transformation inverse complète sur les colonnes suivie de la transformation inverse complète sur les lignes.
 
Cette transformation est dite "rectangulaire". Il existe un autre moyen, la transformation "carrée", on applique une seule étape sur les lignes suivie immédiatement par une étape sur les colonnes. On obtient ainsi quatre zones. On recommence de manière récursive sur la zone en haut à gauche. Pour le Jpeg2000, on utilise cette transformation "carrée" car elle demande moins de calculs et permet d'isoler plus facilement les niveaux de détails.
Ligne 90 :
== Les ondelettes du Jpeg2000 ==
[[Image:Daubechies4-functions.png|thumb|Ondelette de type Daubechies-4]]
La transformation de Haar n'est guère satisfaisante, car elle fait apparaître des blocs après une quantification excessive et les taux de compression sont faibles. Tous ces problèmes sont surtout liés au fait que l'ondelette de Haar n'est pas continue. Pour améliorer cette situation, une autre famille d'ondelettes est employée : les ondelettes de Daubechies. On les doit à une mathématicienne belge, [[:w:Ingrid Daubechies|Ingrid Daubechies]], qui dès le début des années 80 s'est activement consacrée à ce domaine. Les résultats de ses recherches ont été utilisés, mis à part le Jpeg2000, pour le système de stockage des empreintes digitales du [[:w:Federal Bureau of Investigation|FBI]]. Une méthode fut spécialement développée pour tenir compte des caractéristiques des empreintes.
 
Dans le Jpeg2000, une ondelette de type Daubechies 9/7 est utilisée pour la compression avec perte. Pour la compression sans perte, on utilise une LeGall 5/3. Les coefficients obtenus avec l'ondelette de LeGall sont rationnels, cette particularité est nécessaire pour assurer une reconstitution parfaite du signal original. Ces ondelettes n'ont pas été choisies au hasard, elles remplissent plusieurs critères mathématiques qui permettent d'obtenir de bons résultats sur les images. Il faut savoir que, selon le type de signal à analyser, les ondelettes utilisées ne seront pas les mêmes. Nous avons vu que la décomposition de Haar agit comme une succession de filtres passe-haut / passe-bas basiques. Le filtrage avec une "9/7" revient à multiplier les valeurs provenant de l'échantillon avec les coefficients du filtre passe-bas (9 valeurs) et passe-haut (7 coefficients). On additionne les valeurs pour chaque banque de filtres et on obtient un coefficient de moyenne accompagné d'un coefficient de détail.
 
== Étapes de la compression du JPEG 2000 ==
[[Image:Jpeg2000 wikibooks img5.jpg|thumb|right|Résultat de la quantification avec une transformée de Haar. L'image est dégradée, mais le signal reste relativement fidèle à l'original malgré la perte de coefficients.]]
=== Préparation de l'image et découpage en tuiles ===
Avant d'appliquer une décomposition par ondelettes sur l'image, il faut la préparer pour cette opération. La première étape consiste à faire en sorte que l'image possède des dimensions correctes, les filtres ne peuvent pas travailler sur des longueurs quelconques. Les pixels supplémentaires peuvent être ajoutés en recopiant les pixels déjà existants.
Ligne 101 :
On peut ensuite convertir l'image de l'[[:w:Rouge vert bleu|espace RVB]] (rouge, vert, bleu) vers un espace plus approprié pour la compression. Ce processus est optionnel selon la description du standard (et inutile dans le cas d'une image en niveaux de gris).
 
L'oeil humain est très sensible aux changements d'intensité lumineuse. En revanche, les changements de teintes ont moins d'impact sur la vision, deux teintes très proches peuvent être remplacées par la même valeur. Le RVB (rouge, vert, bleu) n'est pas du tout adapté, car il ne sépare pas la luminosité et les composantes chromatiques. Les espaces qui permettent ces manipulations sont le YCbCr (pour la compression avec perte) et le YUV (compression sans perte). Dans la terminologie du JPEG 2000, on parle de ICT ou RCT (''irreversible/reversible component transformation''), ces deux espaces sont des approximations du [[:w:YCbCr|YCbCr]] et du [[:w:YUV|YUV]]. Grâce à une telle transformation, on obtient trois plans. Le Y correspond à un canal de lumière (on pourrait l'assimiler à la version en niveaux de gris de l'image) alors que le Cb et Cr sont dédiés à la couleur. Le Y est le plus significatif et doit subir le moins de pertes possible. Les plans Cb et Cr peuvent en revanche subir des dégradations plus poussées.
 
Un algorithme utilisé également dans le JPEG consiste à réduire la taille des plans d'images grâce à un sous-échantillonnage (''subsampling'' ou décimation). Par exemple, si notre image fait 320x200, le plan Y fera 320x200 pixels alors que les plans Cb et Cr feront 160x100 pixels (rapport de type 4:2:0). Lors de la reconstitution de l'image, on agrandit les plans pour que les tailles correspondent. Dans le JPEG standard, on utilise un rapport 4:2:2 qui signifie que, pour 4 blocs provenant d'un plan Y, on aura 2 blocs horizontaux pour Cb et 2 blocs horizontaux pour Cr. On rencontre parfois des rapports 4:2:0, cette description correspond à 4 blocs Y accompagnés d'un bloc pour Cb et un autre bloc pour Cr (on réduit la taille du plan par un facteur de deux horizontalement et ensuite verticalement).
 
L'étape suivante consiste à découper l'image en petits morceaux appelés ''tiles'' (tuiles). Outre la plus grande flexibilité, cette approche ouvre la porte à une parallélisation du processus (plusieurs tuiles pourraient être décodées en même temps) et une gestion de la mémoire plus fine pour les systèmes embarqués (appareils photos, caméras, etc.).
 
=== Quantification ===
Après une transformation avec des ondelettes, nous nous retrouvons avec un tableau de tuiles et des coefficients pour plusieurs niveaux de détails dans chaque tuile. Pour le choix des coefficients et l'élaboration d'un algorithme de quantification, on fait normalement appel aux [[:w:Perception|études psychovisuelles]] qui permettent de mieux estimer les limites de la vision. On sait que, lors de la restitution d'une image, les hautes fréquences sont moins importantes que les basses fréquences. Dans le cas du JPEG 2000, plusieurs méthodes ont été envisagées, mais seule la [[:w:Quantification|quantification linéaire]] à été retenue, c'est aussi la plus simple et la plus rapide car elle revient à diviser les coefficients par une constante et à arrondir le résultat. Dans le cas d'une compression sans perte, aucune quantification n'est appliquée. Le JPEG 2000 supporte un autre mode de compression avec des tuiles non- quantifiées. C'est au moment de réaliser le flux de données que certains coefficients seront tout simplement éliminés. On attribue une priorité selon le niveau de détails, les coefficients correspondant aux hautes fréquences auront une importance plus faible que ceux des basses fréquences. Lors de l'écriture du fichier, on donne une taille à ne pas dépasser et les données sont sauvées selon leur importance jusqu'à atteindre le ''quota'' alloué.
 
=== Compression et codage arithmétique ===
Ligne 114 :
Pour chaque tuile, nous possédons plusieurs bandes quantifiées qui correspondent à des fréquences différentes. Les bandes sont à leur tour subdivisées en sous-blocs rectangulaires. Ceux-ci vont être encodés, compressés grâce à un [[:w:codage arithmétique|codage arithmétique]] et sauvés dans le fichier. Pour coder un bloc, on travaille avec des plans de bits. Le premier plan significatif (présence d'un '1') voit son index stocké dans une entête qui précède le flux de bits.
 
L'encodage dans le JPEG 2000 se voit complexifié par l'ajout de trois traitements successifs qui suivent le principe du schéma EBCOT (''Embedded Bitplane Coding by Truncation''). Chaque bit provenant d'un plan de bits sera écrit par l'une de ces trois opérations (''significance propagation'', ''magnitude propagation'' et ''cleanup pass''). Ces étapes permettent d'attribuer plus ou moins d'importance à un bit selon son contexte (les bits des coefficients qui l'entourent). Des travaux concernant l'ajout de codes correcteurs (dont les codes de Reed-Solomon <ref>http://perso-etis.ensea.fr/~poulliat/research/publications/CENov03.pdf#search=%22jpeg2000%20reed%22</ref>) ont été menés, mais n'ont pas été intégrés à la version de base du Jpeg. Ils pourraient toutefois apparaître dans les spécifications du JPWL (JPEG 2000 Wireless), un format défini dans la partie 11 du standard.
 
On obtient au final un flux de bits que l'on peut sauver sur le disque avec les entêtes, des métadonnées et un support compatible avec les [[:w:Profil ICC|profils ICC]]. Ces spécificités sont nouvelles par rapport au JPEG qui proposait un début de solution grâce à la norme [[:w:Exchangeable image file format|EXIF]].
Ligne 120 :
== Conclusion ==
 
Le Jpeg2000 est un standard complexe. Il est de ce fait impossible d'examiner toutes ses propriétés en quelques pages, mais nous espérons que cet article vous aura permis de mieux comprendre son fonctionnement. Il existe plusieurs implémentations libres qui peuvent être incorporées dans vos projets. Citons par exemple JasPer (http://www.ece.uvic.ca/~mdadams/jasper/) ou l'implémentation Java du Jpeg2000 (http://jpeg2000.epfl.ch/). Vous pouvez également manipuler le Jpeg2000 avec ImageMagick (http://www.imagemagick.org/). Nous ne pouvons qu'espérer que sa diffusion soit plus large et qu'il soit rapidement intégré au sein des logiciels phares du monde libre comme The Gimp ou encore Firefox.
 
{{Encadré|