{{autre4|le format|le groupe|Joint Photographic Experts Group}}
[[Image:JPEG example flower.jpg|thumb|300px|Une photo de fleur compressée en JPEG, avec des compressions de plus en plus fortes, de gauche à droite.]]
La '''norme JPEG''' est une [[norme]] qui définit le format d'enregistrement et l'[[Algorithmique|algorithme]] de décodage pour une représentation numérique compressée d'une image fixe.
== Introduction au JPEG ==
JPEG est l’acronyme de ''[[Joint Photographic Experts Group]]''. C’est un comité d’experts qui édite des normes de compression pour l’image fixe. La norme communément appelée JPEG, de son vrai nom ISO/IEC IS 10918-1 | ITU-T Recommendation T.81, est le résultat de l’évolution des travaux qui ont débuté dans les années [[1978]] à [[1980]] avec les premiers essais en laboratoire de [[Compression d'image|compression d’images]].
Le groupe JPEG qui a réuni une trentaine d’experts internationaux, a spécifié la norme en [[1991]]. Mais la norme officielle et définitive n'a été adoptée qu'en [[1992]]. Pratiquement, seule la partie concernant le codage arithmétique est brevetée, et par conséquent protégée par [[International Business Machines Corporation|IBM]], son concepteur.
JPEG normalise uniquement l’algorithme et le format de décodage. Le processus d'encodage est laissé libre à la compétition des industriels et universitaires, du moment que l’image produite est décodable par un décodeur standard. La norme propose un jeu de fichiers de tests appelés fichiers de conformance qui permettent de vérifier qu'un décodeur respecte bien la norme. Un décodeur est alors dit conforme s’il est capable de décoder tous les fichiers de conformance.
Le [[brevet logiciel|brevet]] de la norme JPEG a été déposé par l'entreprise Forgent[{{en}} [http://www.asuresoftware.com/ Site de Asure Software - nouveau nom de Forgent depuis 2007]], mais il a été remis en cause par le [[United States Patent and Trademark Office|bureau américain des brevets]] (USPTO), qui l'a invalidé le {{date|24|mai|2006}} pour antériorité existante à la suite d'une plainte de la ''Public Patent Foundation'' qui considère ce brevet invalide[{{en}} [http://www.pubpat.org/Chen672Rejected.htm ''Patent Asserted Against JPEG Standard Rejected by Patent Office as Result of PUBPAT Request'']]. Mais depuis le {{date|27|septembre|2007}}, la société Global Patent Holdings, filiale d'Acacia Research Corporation, a à son tour revendiqué la paternité de ce format.
JPEG définit deux classes de processus de compression :
* avec pertes ou compression irréversible. C’est le JPEG « classique ». Il permet des taux de compression de 3 à 100.
* sans pertes ou compression réversible. Il n’y a pas de pertes d’information et il est donc possible de revenir aux valeurs originales de l’image. Les gains en termes de compression sont alors plus modestes, avec un taux de compression de l’ordre de 2. Cette partie fait l’objet d’une norme spécifique [[JPEG-LS]].
== La compression JPEG ==
Nous allons maintenant nous intéresser à l’algorithme.
On peut diviser la compression et la décompression JPEG en six étapes, voici l’organigramme :
{| align="center"
|-
! [[Image:Compression JPEG.svg|700px|Organigramme de compression]]
|-
! Figure 1 : Organigramme de compression.
Attention, quand on suit l'algorithme du bas, on n'aboutit pas à l'image brute, mais à une image ''restituée'', qui n'est en aucun cas l'image brute. Entre l'image brute et l'image restituée, il y a des écarts, qui seront d'autant plus importants que l'opération de quantification a été forte.
|}
=== Découpage en blocs ===
Le format JPEG, comme le font généralement les algorithmes de compression à perte, commence par découper l’image en blocs ou carreaux généralement carrés de 64 (8 × 8) ou 256 (16 × 16) [[Pixel|pixels]].
=== Transformation des couleurs ===
JPEG est capable de coder les couleurs sous n’importe quel format, toutefois les meilleurs taux de compression sont obtenus avec des codages de couleur de type [[luminance]]/[[chrominance]] tels que [[YUV]], [[YCbCr]] car l’œil humain est assez sensible à la luminance mais peu à la chrominance.
=== Sous-échantillonnage ===
La façon la plus simple d’exploiter la faible sensibilité de l'œil à la chrominance est simplement de sous-échantillonner les signaux de chrominance. Généralement, on utilise un sous-échantillonnage de type 2h1v ou 2h2v. Dans le premier cas (le plus utilisé), on a un sous-échantillonnage 2:1 horizontalement et 1:1 verticalement ; dans le deuxième cas, on a un [[Sous-échantillonnage de la chrominance|sous-échantillonnage]] 2:1 horizontalement et verticalement. Ces sous-échantillonnages sont utilisés pour les chrominances, pour la luminance on n’utilise jamais de sous-échantillonnage.
=== Transformée DCT ===
La transformée DCT (''Discrete Cosine Transform'', en français [[transformée en cosinus discrète]]), est une transformation numérique qui est appliquée à chaque bloc et pour chaque « couleur ». Cette transformée est une variante de la [[transformée de Fourier]]. Cette méthode permet de décrire chaque bloc en une carte de fréquences et en amplitudes plutôt qu'en pixels et couleurs. La valeur d’une fréquence reflète l’importance et la rapidité d’un changement, tandis que la valeur d’une amplitude correspond à l’écart associé à chaque changement de couleur.
À chaque bloc de pixels sont ainsi associées fréquences
La transformée DCT s’exprime mathématiquement par :
{| align="center"
|-
!
|-
! Équation 1 : Transformée DCT directe.
|}
Et la transformée DCT inverse s’exprime par :
{| align="center"
|-
!
|-
! Équation 2 : Transformée DCT inverse.
|}
Dans les deux cas, la constante vaut :
{| align="center"
|-
!
|-
! Équation 3 : Définition de la constante ''C''.
|}
Pour illustrer la compression, a été repris un exemple complet provenant de ''Digital Image Compression Techniques'' de Majid Rabbani et Paul W. Jones[{{Ouvrage |titre=Digital Image Compression Techniques |éditeur=Spie Optical Engineering Press |prénom1=Majid |nom1=Rabbani |prénom2=Paul W |nom2=Jones |langue= anglais |année=1991 |lieu=Bellingham |pages=240 |oclc=23142891 |isbn=0819406481 | passage=}}].
[[Matrice (mathématiques)|Matrice]] (bloc de [[pixel]]s) de base :
{| align="center"
|-
!
|-
! Équation 4 : Matrice d’origine.
|}
En effectuant la transformée DCT, on obtient la matrice des fréquences suivante :
{| align="center"
|-
!
|-
! Équation 5 : Matrice transformée DCT.
|}
==== Remarques ====
Le calcul d’une DCT est complexe. C’est l’étape qui coûte le plus de temps et de ressources dans la compression et la décompression JPEG, mais c’est peut-être la plus importante car elle nous a permis de séparer les basses fréquences et les hautes fréquences présentes dans l’image.
La puissance de calcul disponible aujourd’hui, alliée à des [[Algorithmique|algorithmes]] de type FFT très efficaces, permet de rendre le temps de calcul tout à fait acceptable pour l’utilisateur courant, voire imperceptible pour les machines les plus puissantes.
=== Quantification ===
La [[Quantification (signal)|quantification]] est l’étape dans laquelle on perd réellement des informations (et donc de la qualité visuelle), mais c'est celle qui fait gagner beaucoup de place (contrairement à la DCT, qui ne compresse pas).
La DCT a retourné, pour chaque bloc, une matrice de 8×8 nombres (dans l’hypothèse que les blocs de l’image font 8×8 pixels). La quantification consiste à diviser cette matrice par une autre, appelée matrice de quantification, et qui contient 8×8 coefficients savamment choisis par le codeur.
Le but est ici d’atténuer les hautes fréquences, c’est-à-dire celles auxquelles l’œil humain est très peu sensible. Ces fréquences ont des amplitudes faibles, et elles sont encore plus atténuées par la quantification (les coefficients sont même ramenés à 0).
Voici le calcul permettant la quantification :
{| align="center"
|-
! entier le plus proche
|-
! Avec : entier directement inférieur à
|-
! Équation 6 : Calcul de la quantification.
|}
Et pour la quantification inverse :
{| align="center"
|-
!
|-
! Équation 7 : Calcul de la quantification inverse.
|}
Comme le montre l’image ci-dessous, la quantification ramène beaucoup de coefficients à 0 (surtout en bas à droite dans la matrice, là où sont les hautes fréquences). Seules quelques informations essentielles (coin en haut à gauche) sont gardées pour représenter le bloc.
L'intérêt est qu'au moment de coder le résultat dans le fichier, la longue suite de zéros nécessitera très peu de place !
Mais si la quantification est trop forte (= taux de compression trop élevé), il y aura trop peu de coefficients non nuls pour représenter fidèlement le bloc ; dès lors, à l’écran la division en blocs devient visible, et l'image apparaît « pixellisée ».
Dans notre exemple, nous avons pris la matrice de quantification suivante :
{| align="center"
|-
! align="center"|
|-
! Équation 8 : Matrice définissant le niveau de quantification.
|}
Ce qui donne comme matrice des fréquences quantifiée :
{| align="center"
|-
!
|-
! Équation 9 : Matrice quantifiée.
|}
==== Remarques ====
=== Codage, compression RLE et Huffman ===
Le codage s’effectue en zigzag comme le montre la figure suivante et se termine par un caractère de fin :
{| align="center"
|-
! [[Image:CompressionJPEGImage13.gif|Ordre de codage défini par la norme JPEG]]
|-
! Figure 2 : Ordre de codage défini par la norme JPEG.
|}
Codage de notre exemple : .
Ce résultat est ensuite compressé selon un algorithme [[Run-length encoding|RLE]] basé sur la valeur 0 (le codage RLE intervient uniquement sur cette dernière), puis un codage entropique de type [[Codage de Huffman|Huffman]] ou [[codage arithmétique|arithmétique]].
Avec le schéma de codage très simplifié suivant, on remarque que le codage nous délivre deux tables (quatre pour une image couleur). Ces tables étant enregistrées dans le fichier final peuvent être choisies par le compresseur.
{| align="center"
|-
! [[Image:CompressionJPEGImage14.gif|Schéma de codage simplifié]]
|-
! Figure 3 : Schéma de codage simplifié.
|}
=== Décompression JPEG ===
Les étapes de la décompression s’effectuent dans l’ordre inverse de la compression suivant les méthodes définies précédemment (en même temps que la compression).
Voici dans notre exemple le résultat de la décompression :
{| align="center"
|-
!
|-
! Équation 10 : Résultat de la décompression.
|}
Ainsi que la matrice d’erreur :
{| align="center"
|-
!
|-
! Équation 11 : Matrice des erreurs réalisées par les pertes.
|}
==== Remarques ====
Les erreurs sont au maximum de 5 et en moyenne 1,6 sur environ 150 ce qui nous donne une erreur moyenne d’environ 1 %, et tout cela pour un passage de 64 à 10 valeurs (avec le caractère de fin) ; à cela, il faut rajouter la matrice de quantification, mais comme généralement on compresse de gros fichiers, elle n’influence que peu.
=== JPEG, codage sans pertes ===
Ici, la précision p des échantillons varie de 2 à 16 bits. À la place de la DCT, le codage utilise un prédicteur P à trois échantillons.
{| align="center"
|-
! [[Image:CompressionJPEGImage17.gif|Schéma de compression JPEG sans pertes]]
|-
! Figure 4 : Schéma de compression JPEG sans pertes.
|}
== Syntaxe et structure ==
JPEG peut désigner soit l'encodage d'une image, soit le format de fichier. En effet, différents formats de fichiers ([[Tagged Image File Format|TIFF]], [[Portable Document Format|PDF]], JPG, …) peuvent contenir une image encodée en JPEG. On parlera dans ce paragraphe du format de fichier (aussi appelé JIFF pour ''JPEG image file format'').
Un fichier JPEG est constitué d'une séquence de ''segments'' commençant par un ''marqueur''. Un marqueur se compose de la valeur 0xFF suivie d'un [[octet]] identifiant le type de marqueur. Certains marqueurs ne contiennent que ces deux octets ; d'autres sont suivis de deux octets spécifiant la taille en octets des données du segment. Cette taille inclut ces deux octets de taille mais pas ceux du marqueur.
{| class="wikitable"
|+ Marqueurs JPEG courants[{{Lien web | url = http://www.digicamsoft.com/itu/itu-t81-36.html | titre = ISO/IEC 10918-1 : 1993(E) p.36 }}]
! Abréviation
! Valeur
! Contenu
! Nom
! Commentaires
|-
! SOI
| 0xFFD8 || ''aucun'' || Start Of Image
| Premiers octets du fichier
|-
! SOF0
| 0xFFC0 || ''taille variable'' || Start Of Frame (Baseline DCT)
| Indique une image encodée par ''baseline DCT'', et spécifie la largeur, la hauteur, le nombre de composantes et le sous-échantillonnage des composantes (par exemple 4:2:0).
|-
! SOF2
| 0xFFC2 || ''taille variable'' || Start Of Frame (Progressive DCT)
| Indique une image encodée par ''progressive DCT'', et spécifie la largeur, la hauteur, le nombre de composantes et le sous-échantillonnage des composantes (par exemple 4:2:0).
|-
! DHT
| 0xFFC4 || ''taille variable'' || Define Huffman Table(s)
| Spécifie une ou plusieurs tables d'Huffman.
|-
! DQT
| 0xFFDB || ''taille variable'' || Define Quantization Table(s)
| Spécifie une ou plusieurs tables de quantification.
|-
! DRI
| 0xFFDD || deux octets || Define Restart Interval
| Spécifie l'intervalle entre les marqueurs RST''n'', en macroblocs. Ce marqueur est suivi de deux octets indiquant sa taille de sorte qu'il puisse être traité comme n'importe quel segment de taille variable.
|-
! SOS
| 0xFFDA || ''taille variable'' || Start Of Scan
| Commence un parcours de haut en bas de l'image. Dans les encodages ''baseline DCT'', il n'y a généralement qu'un seul parcours. Les images ''progressive DCT'' contiennent habituellement plusieurs parcours. Ce marqueur spécifie quelle tranche de données il contient et il est immédiatement suivi par des données codées entropiquement.
|-
! RST''n''
| 0xFFD0 … 0xFFD7 || ''aucun'' || Restart
| Inséré tous les ''r'' macroblocs, où ''r'' est l'intervalle DRI (cf. marqueur DRI). Il n'est pas utilisé s'il n'y a pas de marqueur DRI. Les trois bits de poids faible du code de marqueur varient en boucle de 0 à 7.
|-
! APP''n''
| 0xFFE''n'' || ''taille variable'' || Application-specific
| Ce marqueur permet d'inclure des informations qu'un programme de visualisation peut ignorer tout en restant capable de décoder l'image. Par exemple, un fichier JPEG [[Exif]] utilise un marqueur APP1 pour enregistrer des [[Métadonnée|métadonnées]], organisées selon une structure proche du formatage [[Tagged Image File Format|TIFF]].
|-
! COM
| 0xFFFE || ''taille variable'' || Commentaire
| Contient un commentaire textuel.
|-
! EOI
| 0xFFD9 || ''aucun'' || End Of Image
| Derniers octets du fichier
|}
== Voir aussi ==
* [[Transformée en cosinus discrète|DCT]]
* [[Compression d'image]]
== Notes et références ==
{{Références}}
{{JPEG}}
{{Portail|Algorithmique|Imagerie numérique}}
[[Catégorie:Compression d'image]]
[[ar:جيه بيه إيه جي]]
[[az:JPEG]]
[[bg:JPEG]]
[[ca:JPEG]]
[[cs:JPEG]]
[[da:JPEG]]
[[de:JPEG]]
[[el:JPEG]]
[[en:JPEG]]
[[eo:JPEG]]
[[es:Joint Photographic Experts Group]]
[[eu:JPEG]]
[[fa:جیپیئیجی]]
[[fi:JPEG]]
[[gl:JPEG]]
[[he:JPEG]]
[[hr:JPEG]]
[[hu:JPEG]]
[[id:JPEG]]
[[it:Joint Photographic Experts Group]]
[[ja:JPEG]]
[[ka:JPEG]]
[[ko:JPEG]]
[[lt:JPEG]]
[[lv:JPEG]]
[[ml:ജെ.പി.ഇ.ജി.]]
[[nl:Joint Photographic Experts Group]]
[[no:JPEG]]
[[pam:JPEG]]
[[pl:JPEG]]
[[pt:Joint Photographic Experts Group]]
[[ro:JPEG]]
[[ru:JPEG]]
[[sk:JPEG]]
[[sl:JPEG]]
[[sv:JPEG]]
[[th:JPEG]]
[[tr:JPEG]]
[[uk:JPEG]]
[[ur:مشترکہ گروہ برائے عکسیہ ماہران]]
[[vi:JPEG]]
[[yo:JPEG]]
[[zh:JPEG]]