Chapitre 2. GIF, PNG, LossLess-JPEG et JPEG-LS
2.4. JPEG-LS
2.4.6. Mode par plage
0,
log2
E(X
¯
e)
2
oùXe¯est la VA de l’erreur de prédiction.
L’espérance E(Xe¯) n’est évidemment pas connue et doit donc être ajustée à
chaque nouveau pixelpcodé. L’algorithme de Golomb (voir chapitre 3 volume 1)
opère cet ajustement en utilisant un compteur N et une variable de cumul A. Ce
principe est modifié pour prendre en compte le contexteδpet les valeurs transformées
des erreurs¯ep. Quatre variables sont alors utilisées :A[Qp],N[Qp],B[Qp]etC[Qp].
Leurs indices expriment la dépendance contextuelle.
Ces variables servent au calcul :
– du rapport B[Q
p]
N[Q
p] qui est l’estimation couranteE(Xe|Qp)de l’espérance des
erreurs de prédictionepconnaissant le contexteQp=⇒il est utilisé pour le calcul de
la transforméeep7→e¯p;
– du rapport A[Q
p]
N[Q
p] qui est l’estimationE(X¯e|Qp)des valeurs transformées des
erreurse¯p connaissant le contexteQp =⇒il est utilisé pour estimer la valeurkde
l’algorithme de Golomb (voir chapitre 3 volume 1).
La variableC[Qp]enregistre la valeur du biais introduit dans les erreurs de
pré-diction ep =⇒ elle est utilisée pour la correction du biais. Initialement, A[Qp] =
max (2,⌊(α+ 32)/64⌋)[WEI 99].
Toujours dans un soucis d’éviter l’opération de division, l’estimation du paramètre
kpeut également être réécrite :
k= max
0,⌈log2 A[Qp]
N[Qp]
= argmin
k∈
N +2kN[Qp]> A[Qp]
2.4.6. Mode par plage
Le codage de Golomb souffre du même inconvénient que l’algorithme de
Huff-man. Lorsque l’entropie est faible, l’algorithme ne pouvant descendre en deçà d’un
bit par symbole, le codage n’est pas optimal.
Typiquement, les régions uniformes en intensité de l’image à coder ont une faible
entropie. Aussi, une extension de l’alphabet de la source est envisagée pour ses zones
particulières. Ce procédé est similaire à celui utilisé par le codeur de Huffman : il
s’agit de construire des hypersymboles regroupant plusieurs échantillons. Le
pas-sage du mode normal ou mode par plage est effectué grâce au test d’uniformité du
contexte :[g1, g2, g3] = [0,0,0]. Autrement dit,˜a= ˜b= ˜c= ˜d.
Une fois en mode par plage, le processus suppose qu’il existe une séquence
de valeurs identiques àa˜. Cette séquence s’arrête quand la fin de la ligne est atteinte
ou lorsqu’une valeur diffère dea˜. La longueur de la séquence est alors codée. Le
décodeur n’a pas besoin de connaître la valeur a˜ puisqu’il se trouvera, au même
instant, dans le même contexte et effectuera, donc, le même changement de mode.
Lorsque la séquence s’arrête avec une fin de ligne, le codeur revient directement en
mode régulier. En revanche, quand une valeurx 6= ˜avient arrêter la séquence, le
codeur entre en étatend-of-run.
La longueur r, de la séquence est codée à l’aide du paramètre m – détaillé
ci-après – et d’un codage unaire inversé : le bit1indique le codage d’une portion –
de taille6 m– d’une séquence tandis que le bit0tient lieu de séparateur entre les
séquences. L’alphabet utilisé par ce codage est fini : {0,10,110,· · ·,1m−10,1m
}.
Mais les longueursr, des séquences ne sont pas forcément des multiples dem. Aussi,
un bit0est suivi par le code binaire de la longueur de la fin de la séquence. Ainsi,
l’algorithme de Golomb d’ordre m = 2k est optimal pour ce codage. Toutefois,
lors du codage d’une séquence, l’ordrekest ajusté grâce à une tableT et un indice
Irun. L’indice référence l’entrée dans la table qui permet de mettre à jour la valeur
dek. Initialement, l’indice Irun = 0. Il est incrémenté (resp. décrémenté) à chaque
émisssion d’un bit1(resp. d’un bit0). Le procédé est décrit par l’algorithme qui suit :
CODEUR PAR PLAGE()
1 k←T[Irun] // retrouver la valeur de k dans la table T
2 m←2ktant quer>m
3 faire Emettre1// la sous-séquence de taille m est codée
4 r←r−m // mise à jour de la longueur à coder
5 Irun←min(Imax, Irun+ 1) // l’indice est incrémenté
6 k←T[Irun]
7 m←2k // mise à jour en cours de codage de la séquence
8 siEN D_OF_RU N
9 alors // la séquence s’arrête avant la fin de ligne
10 Emettre0// fin de la séquence
11 Emettre k bits// pour coder la fin de la séquence
12 Irun←max(0, Irun−1)
13 sinon // fin de ligne rencontré
14 sir >0
La tableTvaut :
0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3
4 4 5 5 6 6 7 7 8 9 10 11 12 13 14 15
Lorsque la séquence se termine par une valeurxdifférente de la valeur de référence
˜
a, la différence de cet échantillon avec son voisin direct,˜bx, est codée. L’algorithme
de Golomb est utilisé comme en mode régulier [PNG 03].
2.4.7. Quasi sans perte
Le standard JPEG-LS autorise un codage quasi sans perte grâce à un paramètre de
contrôle NEAR que l’utilisateur peut ajuster. SiNEAR = 0, le codage est sans perte.
Sinon(NEAR>0), le calcul de l’erreurepet la reconstructionx˜sont à adapter :
ep ← sign(ep)abs(ep) + NEAR
2 NEAR +1
˜
x ← x+spep(2 NEAR +1)
La substitution ne change pas le comportement de l’algorithme puisque le codage
sans perte correspond au cas oùNEAR = 0. Certains autres changements mineurs
sont également nécessaires. Par exemple, le choix du mode par plage se fera quand le
test suivant est vérifié :
abs(g1)<NEAR et abs(g2)<NEAR et abs(g3)<NEAR
2.4.8. Synthèse du format JPEG-LS
Ce standard propose une adaptation contextuelle forte pour obtenir des taux de
compression élevés. Le contexte est défini par le voisinage du pixel observé. Il
inter-vient dans le choix du mode de compression : régulier ou par plages.
Si le voisinage est contrasté, le codeur entre en mode régulier. Ce voisinage est
utilisé à la fois pour estimer la prédiction et pour modéliser le contexte associé au
pixel à coder.
La prise en compte du voisinage par la prédiction permet de diminuer l’entropie
de la source à coder. La distribution de la prédiction est alors de type laplacienne,
c’est-à-dire symétrique et centrée en 0. En repliant cette courbe en son centre, cette
distribution devient géométrique. Pour effectuer ce repliement, JPEG-LS s’assure que
le centre est bien en 0 par une étape de traitement de la source appeléecorrection du
biais.
L’algorithme de Golomb étant optimal pour des distributions géométriques, il est
utilisé avec, en complément, une modélisation contextuelle. Celle-ci opère une
quan-tification des données qui permet de réduire l’alphabet à coder à 365 entrées.
Lorsque le voisinage est uniforme (ou presque en mode quasi sans perte) un codage
par plages est effectué afin de regrouper toutes les valeurs identiques en un unique
symbole (la longueur de la plage). A nouveau, l’algorithme de Golomb est utilisé.
Ainsi, il existe deux modes comportant des prétraitements différents mais utilisant
le même codeur entropique en fin de chaîne.
Dans le document
Le multimédia
(Page 51-54)