Vous êtes sur la page 1sur 22

Techniques non destructives

• RLE (Run-Length Encoding)

Si une donnée d apparaît n fois consécutivement dans le flux d’entrée, remplacer les n occurrences par la
paire “n d”.

Taux de compression fonction du contenu !

Soit une chaîne de caractère de taille N à compresser. Supposons que cette chaîne contienne M répétions de
longueur moyenne L d’un caractère. Quel est le quotient de compression si cette chaîne est compressée selon
l’algorithme RLE ?
Chacune des M répétitions est remplacée par 2 caractères
Donc la taille de la chaîne compressée est N-ML+2M

Et s’il y a plus de 255 fois le même pixel (codage 8 bits) ?


Ex : 1111000...00011
Solution : insertion d’un 0 tous les 255 pixels.
ex : 0 4 255 0 145 2 (d) = 00 04 FF 00 91 02 (h)

Signature (2 octets) : “BM” ou 42 4D (h)


Taille (4 octets) : 00 01 29 76 (h)
Offset (4 octets) : 36 (h) (adresse relative des infos concernant l’image, indique l'adresse où l'image va
commencer)
Taille de l’entête de l’image (4 octets) :
Largeur de l’image (4 octets) : 01 35 (h) = 309 pixels
Hauteur de l’image (4 octets) : 52 (h)= 82 pixels

Application : le format BMP (codage sur 8 bits, RGB)


• Les pixels compressés sont organisés par paire d’octets : 04 02 = 02 02 02 02
00 est un caractère d’échappement, et sa signification dépend de l’octet suivant :
• 00 00 = eol (end of line)
• 00 01 = eni (end of image)
• 00 02 = saut dans l’image. Les 2 octets suivants indiquent le nombre de ligne et de colonne.
• 00 XX = XX raw pixels. Les XX octets suivants sont les valeurs des pixels.

Voici une image 4x8 compressée, codée sur 8 bits :


04 12 0004 a35b1247 01 f5 02 e7 0002 00 01 01 99 03 c1 0000 0004 08926bd7 0001
• Une fois décompressé, on obtient :

1 1 1 1 a3 5 1 47
2 2 2 2 b 2
f5 e7 e7 0 0 0 0 0
0 0 9 c1 c1 c1 0 0
9
8 9 6 d 0 0 0 0 • Méthodes statistiques
2 b 7
L’information propre apportée par un événement x, notée h(x), est d’autant plus faible que sa probabilité p(x)
est élevée, et vaut
h(x) = −log2(p(x))
On appelle entropie moyenne de la source X la quantité H(X) définie par :
Cette entropie représente le nombre moyen d’éléments nécessaires à la codification des différentes
réalisations de X.
Exemple : Considérons un jeu de 32 cartes. On extrait une carte au hasard.
Quelle est l’incertitude liée à l’événement x={la carte extraite est un roi de
coeur} ?
h(x) = −log2(p(x)) = log2(32) = 5bits
En effet, chaque carte peut donc être décrite à l’aide de 5 digits binaires.

Le contenu de cette source sera compressible, sans perte d’information, si son entropie n’est pas
maximale. On dit alors que cette source possède de la redondance,
Redondance = 1−H(S)/Hmax

Nombre moyen de symboles, noté L, nécessaires à la représentation d’un symbole de la source,

Mais peut-on diminuer L autant que souhaité ? NON ! Le théorème fondamental du codage de source précise
qu’on a : L >= H(S)/log2(q)
Ce qui, dans le cas d’un alphabet de codage binaire, se réduit en : L>= H(S)
L’efficacité du code,

• Codage de Huffman

Principe : attribuer au symbole le plus probable le mot de code le plus court


Méthode : construction d’un arbre (binaire, dans le cas d’un code binaire)
Le code de Huffman : il n’est pas unique !
Code optimal à longueur variable produisant la longueur moyenne L des mots du code la plus faible (au sens
où L = H(S)). Mais ... elle nécessite la connaissance préalable des probabilités d’apparition des symboles de
source.
Exemple : soit un source émettant les symboles u1,..., u6, avec des probabilités de 0.4, 0.3, 0.1, 0.1, 0.06 et
0.04 respectivement.

2
Le code adaptatif de Huffman
Idée : construction de l’arbre au fur et à mesure de la lecture, avec estimation en ligne des probabilités
d’apparition des symboles de la source. L’arbre est donc modifié en ligne en fonction de cette estimation.
Problème : A aucun moment l’arbre ne lui est transmis. Le décodeur doit donc reconstruire de son côté
l’arbre au fur et à mesure de la lecture des mots de code. On dit alors que l’encodeur et le décodeur sont
synchronisés.

• Codage arithmétique
Idée : représenter non plus chaque symbole par un mot de code, mais plutôt l’ensemble du fichier par un
unique (long) code
Soit 3 symboles a1, a2 et a3, avec p(a1)=0.4, p(a2)=0.5 et p(a3)=0.1
Soit à coder la séquence a2 a2 a2 a3.
1/ Considérer l’intervalle [0;1[, divisé selon les p(ai)

2/ Coder a2 revient à se limiter à l’intervalle [0.4;0.9[


3/ Partitionner le nouvel intervalle selon les p(ai)
4/ Coder le 2nd a2 revient à se limiter à l’intervalle [0.6; 0.85[
5/ Partitionner le nouvel intervalle selon les p(ai)
5/ Coder le 3ème a2 revient à se limiter à l’intervalle [0.7;0.825[
6/ On partitionne le nouvel intervalle
7/ Coder a3 revient à considérer l’intervalle [0.8125;0.8250[

Conclusion : la séquence a2 a2 a2 a3 peut être représentée par n’importe quel nombre dans l’intervalle
[0.8125; 0.8250[, par exemple 0.8150
Mais : à chaque nouveau symbole, l’intervalle à considérer devient de plus en plus petit, et il faut de plus en
plus de bits pour le représenter
Décodage : soit à décoder le nombre 0.8150
- 0.8150 appartient à l’intervalle [0.4;0.9[ : on décode donc a2
- on calcule (0.8150 - borne_min)/larg_interval = (0.8150-0.4)/0.5 = 0.83
- 0.83 appartient à l’intervalle [0.4;0.9[ : on décode donc a2
- on calcule (0.83 - 0.4)/0.5 = 0.86
- 0.86 appartient à l’intervalle [0.4;0.9[ : on décode donc a2
- on calcule (0.86 - 0.4)/0.5 = 0.92
- 0.92 appartient à l’intervalle [0.9;1[ : on décode donc a3
Implémentation pratique :
On stocke les bornes minimales et maximales des intervalles considérés au fur et à mesure du codage ... mais
ces bornes n’ont pas une précision infinie ! De la même façon, le décodage implique des soustractions et
divisions sur un nombre pouvant être codé sur un nombre extrêmement important de digits.
Solution : on utilise une représentation entière de ces bornes, codées le plus souvent sur 16 ou 32 digits.
Ainsi , d’une manière générale, le codage arithmétique est plus efficace (au sens théorie de
l’information) que le codage de Huffman.

3
• Méthodes par dictionnaire

L’idée principale est de remplacer le symbole à coder par son index (numéro) et représentant dans un
dictionnaire. e dictionnaire peut être statique et connu à l’avance, ou au contraire dynamique, construit au
fur à et à mesure de la compression. Le contenu de ce dictionnaire conditionne complètement les
performances de la compression.
Un premier exemple simple
Méthode de compression en 2 passes :
- 1ère passe : lecture octet par octet de l’intégralité du fichier à compresser, et construction d’une liste
contenant l’ensemble des octets présents (ex :niveaux de gris) ainsi que leur fréquence d’apparition.
- Classement de la liste par ordre décroissant des fréquences. Cette liste classée devient le dictionnaire. Elle
est écrite dans la sortie du compresseur.
- 2nde passe : relecture du fichier pour en effectuer la compression. Chaque octet est remplacé par son index
dans la liste, codé selon 1 à 8 bits, précédé de 3 bits indiquant la taille de cette index

Dictionnaire :
code ndg 0000000100111 010 111000100110
“0” 132 Longueur de l’index = 3
“1” 177
“11” 72 0000000100111 010 111 000100110
“10” 35 Code index = 111
Image = 59
“111” 59
Afin d’éviter d’avoir à effectuer 2 passes (ce qui peut être très long), l’idée est d’utiliser un dictionnaire qui
se construit au fur et à mesure, basé sur les symboles apparus précédemment dans le flux.

Principe du LZ77:
Soit la chaîne de caractère suivante à compresser “ceci cela ou cette idée”. Cette chaîne de caractère va
passer dans une fenêtre glissante, constituée d’un buffer de recherche et d’un buffer de lecture.

ceci cela cette idée


ou
buffer de recherche buffer de lecture

Imaginons que nous en soyons à coder “ cette idée”. Le compresseur va regarder lettre par lettre si une
occurrence du ou des caractères à coder a déjà été traité. C’est le cas ici, puisque le chaîne “ ce” apparaît
dans le buffer de recherche, 8 caractères en amont. Le compresseur remplace donc le “ ce” par le pointeur
(8,2,”t”), indiquant que la chaîne codée est analogue à celle se trouvant 8 caractère en amont et qu’elle est
d’une longueur de 2 caractères. Cette chaîne est ensuite suivie de la lettre “t”.

4
Les pointeurs sont donc de la forme (offset, longueur, “caractère”)
- Le champ offset est constitué typiquement de 10 à 12 bits,
- Le champ longueur est constitué de quelques bits,
- Le champ “caractère” est typiquement constitué de 8 bits.
Ainsi, un pointeur occupe typiquement une place d’environ 24 bits = 3 octets. La méthode suppose
implicitement que des motifs réguliers proches les un des autres (principe du buffer) apparaissent dans le
flux d’entré. Si c’est effectivement le cas, l’algorithme L77 présente de fort taux ce compression
(typiquement autour de 50%).

LZ78 :
Cette fois, il n’y a plus aucun buffer ni fenêtre glissante, mais seulement un dictionnaire construit au fur et à
mesure de la lecture. Le compresseur sort un pointeur constitué d’un index du dictionnaire et d’un
caractère : (index, ‘“r”).
Principe :
Chaque caractère est lu et comparé aux différentes entrées du dictionnaire. Si le caractère testé a déjà été
rencontré, alors le caractère suivant est concaténé au premier. La chaîne ainsi formée est à son tour
confrontée aux différentes entrées du dictionnaire.
Exemple : ceci cela ou cette idée
Au démarrage, le dictionnaire est vide
Inde Chaîne Inde Chaîn
x x e
0 null 0 null
1 “c”
2 “e” ceci cela ou cette idée = (0,”e”)
ceci cela ou cette idée = (1,”i”)
3 “ci”
ceci_cela ou cette idée = (0,” ”)
4 ““
ceci cela ou cette idée = (1,”e”)
5 “ce” ceci cela ou cette idée = (0,”l”)
6 “l” ceci cela ou cette idée = (0,”a”)
7 “a” ceci cela_ou cette idée = (4,”o”)
8 “ o” ceci cela ou cette idée = (0,”u”)
9 “u” ceci cela ou_cette idée = (4,”c”)
10 “ c” ceci cela ou_cette idée = (2,”t”)
11 “et”

Et si le dictionnaire est plein ? L’algorithme original ne spécifie aucune solution ! Représentation du


dictionnaire sur un nombre grandissant de bits, jusqu’à le rendre fixe. Si le taux de compression chute trop,
construction d’un nouveau dictionnaire. C’est la méthode utilisée par le programme UNIX compress.

LZW (Lempel-Ziv-Welch) La compression d’aujourd’hui !


La sortie du compresseur n’est constituée que des index du dictionnaire, initialisé par un alphabet au
démarrage. LZW est aujourd’hui utilisée dans le format GIF ou dans le format PDF.

Bilan
 La compression RLE peut être utilisée pour de la compression sans ou avec perte. C’est une technique
simple utilisée par certaines parties du JPEG. En générale, cette méthode marche bien pour des images
binaires
 Les méthodes statistiques donnent de bons résultats lorsque les symboles à compresser possèdent
différentes probabilités d’apparition.
o pas adapté aux images avec de lentes variations de couleur
o adapté aux images possédant des discontinuités de couleur ...difficile à prévoir en voyant l’image
 Les méthodes par dictionnaire donnent de bons résultats si l’image présente des motifs répétitifs. Et
la qualité de la compression dépend énormément de la façon dont l’image est lue.

5
Techniques destructives
Principe fondamental :

Etant donné un pixel, il y a de forte chance que ses voisins possèdent la même couleur, ou du moins une
couleur similaire

Les techniques de compression que nous allons voir sont donc basés sur le fait que les niveaux de gris de
pixels voisins sont fortement corrélés. On parle alors de redondance spatiale. Exemple :

Voici une séquence de niveaux de gris :


12, 17, 14, 19, 21, 26, 23, 29, 41, 38, 31, 44, 46, 57, 53, 50, 60, 58, 55, 54, 52, 51, 56, 60

Ici, seulement 2 pixels sont identiques. La valeur moyenne des NdG est de 40.3.

Travaillons maintenant avec les différences de 2 pixels adjacents :


12, 5, -3, 5, 2, 4, -3, 6, 11, -3, -7, 13, 4, 11, -4, -3, 10, -2, -3, 1, -2, -1, 5, 4

Cette séquence illustre le potentiel de la compression :


o Les différences possèdent des valeurs plus faibles que les pixels originaux, leur valeur moyenne
étant seulement de 2.58,
o Les différences possèdent des valeurs répétitives,
o Les différences sont décorrélées : les valeurs adjacentes sont différentes.

Comment mesurer la perte ?

Erreur quadratique moyenne :

Une autres grandeur est traditionnellement utilisée dans la littérature : le rapport sur bruit maximum, ou peak
signal to noise ratio, noté PSNR [dB], avec

Premières méthodes intuitives

1. Sous échantillonnage : on ignore simplement certains pixels. Les effets sur l’image sont très visibles
(grande perte de détails) : cette méthode simple n’est que très peu utilisée.
2. Sous échantillonnage des couleurs : notre oeil est moins sensible aux variations de chrominance que de
luminance. Les deux chrominances sont sous-échantillonnées d’un facteur 2, conduisant à une réduction
de 50% de la taille du fichier
3. Quantification scalaire : on supprime simplement les bits les moins significatifs du codage.
4. Quantification vectorielle : l’image est partitionnée en blocs de tailles fixe (appelés vecteurs). Le
codeur dispose d’une liste de vecteurs prédéfinis (dictionnaire de vecteur), et c’est l’index du vecteur qui
est inscrit dans le fichier compressé.

Transformations orthogonales

Principe :
Ces transformations sont conçues pour posséder 2 propriétés :
- réduire la redondance de l’image,
- identifier les parties les moins importantes de l’image à compresser

6
Ces parties sont le plus souvent identifiées en travaillant sur les différentes fréquences (spatiales) constituant
l’image. Pourquoi ? Les basses fréquences correspondent aux éléments importants d’une image, tandis que
les hautes fréquences décrivent les détails d’une image.
De plus, notre oeil n’est pas sensible aux variations rapides de contraste dans une image.

Ou encore, C = WD, où D est la matrice contenant les pixels de l’image d’origine, et C celle contenant les
coefficients de la transformée. La nature de la transformation est donc entièrement définie à partir de la
matrice W ou des coefficients qui la compose.

C! = WD: seule 1 dimension est traitée.


C = WDWT: les 2 dimensions de l’image sont traitées.

Exemple
Valeur dominante, contenant presque
toute l’énergie de D :
Réduction de la redondance

Parties moins importantes de l’image :


Valeurs plus faibles que celles
des pixels traités

Principe fondamental : concentration de l’énergie dans les basses fréquences.


Idée de la compression : quantification des éléments de C, et plus particulièrement des termes décrivant les
hautes fréquences.

Transformée de Walsh-Hadamard

Définition : (transformée directe)

o Calcul très rapide (additions et soustractions seulement)


o Performances faibles en compression : faible concentration de l’énergie dans les basses fréquences
o Finalement très peu utilisé ...

Transformée de Karhunen-Loève

7
Aussi appelée transformée de Hotelling, ou transformée en vecteurs propres, elle est utilisée pour l’analyse
en composantes principales.
Elle est théoriquement la transformée qui possède la meilleur efficacité en terme de concentration de
l’énergie, mais reste peu utilisée en pratique puisqu’elle est très lourde en temps de calcul.
Elle donne la plus grande distribution de variance sur les axes.

Soient A la matrice de transformation de Karhunen-Loève et W la matrice contenant le résultat de la


transformation. L’image d’origine est partitionnée en k blocs de longueur n (vecteur colonne). La matrice V
de l’image d’origine est constituée des k matrices précédentes, préalablement centrées.
On a donc : W = AV
La matrice VVT est symétrique, et ses éléments sont les covariances des colonnes de V.
La transformation de KL consiste à choisir comme matrice A la matrice constituée des vecteurs propres
(orthogonaux) normalisés de VVT, de sorte que :

WWT = A(V V T )AT = λi x I. où les lambda désignent les valeurs propres de V V T.

Ainsi, cette transformation dépend de l’image ! De plus, la matrice A doit être incluse dans le fichier de
l’image compressé, et aucune méthode rapide de calcul de A n’a encore été découverte. En conséquence, elle
est très peu utilisée.

Transformée en cosinus
C’est la transformation de très loin la plus utilisée en compression.
Transformation directe (1D) :

Transformation inverse (1D) :

... mais ces définitions ne sont en pratique pas utilisées pour les calculs !

Cette transformation tends à concentrer de manière importante dans les premiers coefficients Ck toute
l’information. Ces premiers coefficients représentent les informations importantes de l’image, et sont liées
aux basses fréquences des cosinus de la transformation.
Les autres coefficients sont nuls ou quasi-nuls, et correspondent à des plus hautes fréquences des cosinus.
Exemple :
p = (12, 10, 8, 10, 12, 10, 8, 11) C = (28.6, 0.6, 0.5, 1.8, 3.2, -1.7, 0.2, -0.3)
C’ = (28, 0, 0, 2, 3, -2, 0, 0) p’ = (11.2, 9.6, 7.7, 9.6, 12.3, 10, 8.1, 10.7)
soit au maximum une erreur de 6% seulement !
Dans le cas précédent, les données étaient fortement corrélées (p = (12, 10, 8,
10, 12, 10, 8, 11)). Et si ce n’est pas le cas ?
soit une erreur au maximum de 88% !

De la même façon, la taille n de la transformée a une importance capitale :


• si n est trop faible, le nombre de coefficients est également faibles, et ils ont donc tous des valeurs
importantes,
• si n est trop grand, alors les valeurs à traiter peuvent devenir trop décorrélées.

8
En pratique, une valeur de n=8 est un bon compromis, et la plupart des algorithmes de compression utilisent
une telle valeur.

Transformée en cosinus 2D

Transformation directe :

Transformation inverse :

Méthode de compression :
1/ Partitionner l’image à compresser en blocs carrés de 8x8 pixels. Si les dimensions ne sont pas multiples de
8, périodiser les derniers blocs.
2/ Calculer la transformée en cosinus de chacun des blocs
Rem : aucune information n’a encore été perdue !
3/ Arrondir (quantifier) les transformées de chacun des blocs. La destruction de l’information a lieu à ce
stade. Plus l’arrondi sera important (concrètement, cela revient à arrondir à 0 plus de coefficients), plus la
destruction sera perceptible.

La transformée en cosinus est bien mieux adaptée aux images à “tons continus” qu’aux images à “tons
discrets”

Il existe 4 formes de transformée en cosinus, appelées DCT-I, DCT-II, DCT-III et DCT-IV, et définies par :

9
Implémentation pratique :
1/ Quelle que soit la taille de l’image, il n’y a que 32 cosinus impliqués dans le calcul de la TCD 2D. Ceux-ci
peuvent être précalculés de façon à améliorer le temps de calcul.
2/ La double somme précédente peut s’exprimer sous la forme matricielle où P est la matrice 8x8 des pixels,
et les éléments de C s’expriment sous la forme :

Ainsi, sous la forme matricielle précédente, où chacune des matrices est de dimension 8x8, il faut :
- 64x8 = 8^3 multiplications pour calculer CP
- et donc il faut 2x8^3 multiplications pour déterminer CPCT
Si l’image est carrée, de dimension nxn, avec n = 8q (n = multiple de 8), il y a donc qxq blocs de 8x8
constituant l’image. Au final, sous la forme matricielle, il faut 2q283 multiplications par coefficients de la
DCT (et autant d’additions).
En comparaison, le calcul de la DCT sur l’image au complet nécessiterait 2n^3 opérations (2n3=q(2q283) ).
Ainsi, le calcul matriciel a divisé par q le nombre d’opérations à effectuer !
Cependant, le calcul de la DCT sous forme matricielle d’une image 512x512 couleur nécessite encore
environ 12 582 912 multiplications !

Et pourquoi pas une transformation en sinus ?


La transformée en sinus ne possède pas de terme continu !

Considérons le cas 1D, avec P = (100, 100, 100, 100, 100, 100, 100, 100)
- La TC donne (282.8, 0, 0, 0, 0, 0, 0, 0)
- La TS donne (0, 256.3, 0, 90, 0, 60.1, 0, 51)

- Il n’y a aucune concentration - Les valeurs continues ne détérioration de la


de l’énergie en basse peuvent être qu’approximées reconstruction
fréquence - La quantification des
coefficients produit une grande

10
Et pourquoi pas une transformée de Fourier ?
Sauf cas particulier, la TF d’un signal (1D ou 2D) réel est un
nombre complexe.
De plus :

Il n’y a aucune concentration de l’énergie en basse fréquence


pour la DFT

Le JPEG :

(Joint Photographic Experts Group) n’est pas un nom de fichier,


mais une méthode de compression.
C’est aujourd’hui une des méthodes de compression les plus
utilisées, notamment grâce aux forts taux de compression dont
elle est capable. Ainsi, des taux de 10:1 à 20:1 peuvent être
obtenus sans dégradations visibles de l’image.

Les différentes étapes de la compression sont les suivantes :


1. L’espace des couleurs est transformé en luminance/chrominance.
2. Les deux plans de chrominance sont sous-échantillonnés d’un facteur 2 en ligne et colonne, ou
seulement en ligne. Dans le 1er cas, à ce stade l’image a déjà perdu la moitié de sa taille !
3. Les pixels de chacun des plans de couleur sont organisés en blocs de 8x8 appelés les unités de
données, et chacun de ces blocs est traité séparément.
a. si ‘noninterleaved’ : les plans couleur sont traités chacun leur tour
b. si ‘interleaved’ : les trois premiers blocs de chaque bloc sont traités en premier, etc.
Le traitement séparé de chacun des blocs est un inconvénient !

4. La transformée en cosinus discrète de chacun des blocs est ensuite calculée de façon à obtenir une
image 8x8 des composantes fréquentielles des blocs. Jusqu’à présent, il y a eu des pertes, mais elles sont
très limitées : souséchantillonnage des chrominance et limites de précision des calculs des DCT !
5. Chacun des 64 coefficients obtenus précédemment est divisé par une entier Q(i,j) appelé coefficient
de quantification, dont la valeur varie selon la fréquence considérée. La valeur obtenue est ensuite
arrondie. Cette table de coefficients peut être définie par l’utilisateur, mais les standards du JPEG
recommandent 2 tables pour les luminance et chrominance.
C’est ici que la compression a lieu ! Ces coefficients, selon leur importance, vont définir la qualité de
cette compression.

6. Les 64 coefficients quantifiés, qui sont maintenant des entiers, sont codés en utilisant une
combinaison de RLE et de codage de Huffman. Il existe une variante utilisant un codage arithmétique à
la place de Huffman.
7. Enfin, la dernière étape consiste à écrire dans le fichier les paramètres utilisés pour la compression
(en-tête) et les données compressées.

Il existe un mode progressif permettant lors du décodage l’affiche progressif


de l’image. Dans ce mode, c’est l’ordre d’enregistrement des fréquences qui
est modifié de sorte qu’une lecture partielle du fichier permettent déjà d’avoir
une idée de l’image (avec approximation de pixels manquants)

11
1/ Transformation Luminance / Chrominance
Cette transformation a été normalisée par le CIE qui a défini la CIE-luminance, ou simplement luminance
comme une grandeur proportionnelle à la puissance de la source de lumière.

En pratique (compte tenu de la plus grande sensibilité de notre oeil à la luminance) partant du plan RGB de
représentation des couleurs, il est préférable de travailler dans le plan Y, G-Y, B-Y, ou YCbCr, ou YUV avec :
Y = 0,299 x R + 0,587 x V + 0,114 x B
U = 0,492 (B - Y) = !0,147 R - 0,289 G + 0,436!B
V = 0,877 (R - Y) = 0,615 R - 0,515 G - 0,100!B

La transformation inverse est donnée par :


R = Y + 1,140 V G = Y - 0,395 U - 0,581 V B = Y + 2,032 U

4/ Transformée en cosinus
Elle s’effectue sur des blocs de 8 pixels de l’image. Si les dimensions ne sont pas multiples de 8, les bords de
l’image sont répétés autant de fois que nécessaire.

A la décompression, la transformée inverse est utilisée :

5/ Quantification des coefficients de la DCT


JPEG définit des tables de quantification par défaut, dont les valeurs sont le résultat de nombreuses mesures
réalisées par le comité.

Il est également possible de définir sa propre table de quantification, par exemple avec :
Q(i, j) = 1 + (i + j)R

12
Compression des coefficients /6
Tout d’abord, les 64 coefficients
sont collectés en lisant les matrices
8x8 en zigzag. Ensuite, la méthode
JPEG s’intéresse au codage de la
composante continue. L’idée est la
suivante : trois blocs successifs
possèdent vraisemblablement des
niveaux de gris très proches. L’idée
est de venir coder les différences
des moyennes plutôt que les
niveaux eux-mêmes.

Chacune des valeurs continues (ou leur différence) est codée selon le code de Huffman représenté dans le
tableau suivant :

On code donc la séquence 1118, -4, 5 par : (code_ligne | numéro colonne)


(111111111110 | 01110100010) , (1110 | 011), (1110 | 101)

Ensuite, le compresseur s’intéresse aux 63 valeurs “haute fréquence”, en utilisant une combinaison des
algorithme RLE et Huffman. Là encore, 2 tableaux normalisés sont introduits et permettent de déterminer,
par simple lecture successive, le code à écrire. Le premier d’entre eux est le même que précédemment. Le
second est donné par :

13
Soit par exemple la séquence 1118, 2, 0, -2, 0 (13 fois), -1, 0 ...
L’encodeur s’intéresse au nombre Z de zéros précédent une valeur x non nulle :
- trouver x dans le 1er tableau, et mémoriser son emplacement (R,C)
- la paire (R,Z) est utilisée comme (ligne, colonne) pour le second tableau
- enfin, le code de Huffman trouvé dans ce tableau est concaténé à C

1118 2 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 ...
Le premier coefficient x=2 se situe sur la ligne R = 2 et C=2, et il y a Z=0 zéros avant.
On s’intéresse donc au code situé en (R=2,Z=0) du second tableau : 01
1118 2 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 ... On code : 01 | 10

1118 2 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 ...
Le second coefficient x=-2 se situe sur la ligne R = 2 et C=1, et il y a Z=1 zéros avant.
On s’intéresse donc au code situé en (R=2,Z=1) du second tableau : 11011
1118 2 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 ... On code : 11011 | 01
1118 2 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 ...
Le coefficient x=-1 se situe maintenant sur la ligne R = 1 et C=0, et il y a Z=13 zéros avant.
On s’intéresse donc au code situé en ( R = 1 , Z = 1 3 ) du second tableau:1110101
1118 2 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 ... On code : 1110101 | 0
1118 2 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 ...
Enfin, la séquence de 0 se code simplement 1010 (du second tableau)
Au final, la séquence :
1118 2 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 ... Se code :
11111111111101110100010 01101101110111010101010

Ces 46 bits codent une seule composante couleur d’un bloc 8x8. Imaginons que les autres plans couleur
soient également codés avec un mot de 46 bits.
Dans ce cas, la compression est de : (64*3*8)/(46*3) = 11.13 !
En fait, le taux est même meilleur puisque les composantes continues (qui occupent ici 23 des 46 bits) des
autres blocs sont codées à partir des différences !

Des variantes du JPEG utilisent plutôt du codage arithmétique adaptatif, appelé codeur QM, qui ne nécessite
donc pas les tableaux 1 et 2. En pratique, le gain obtenu est autour de 5 à 10%. Mais son utilisation reste rare.

Versions lossless (“sans pertes”)


Elle est basée sur un codage prédictif. Plusieurs prédicateurs simples sont définis (uni ou bidimensionnel),
puis chaque valeur subit un codage entropique. En pratique, le JPEG sans perte n’est pas utilisé. Il fournit des
taux de compression de l’ordre de 50%, alors que des algorithmes de type RLE ou Huffman adaptatifs
peuvent faire parfois mieux. Une autre implémentation, appelée JPEG-LS a été créée pour tenter
d’améliorer les performances. Celle-ci est plus utilisée, mais ne peut être considérée comme étant
rigoureusement “sans pertes”.

14
Transformées en ondelettes

La transformée en ondelettes propose d’utiliser un ensemble de fonctions de base dynamique représentant la


fonction à traiter de la manière la plus efficace possible.
Par exemple, supposons que nous souhaitions traiter le vecteur x = (2, 2, 2, 2). Une première décomposition
consisterait à considérer le vecteur x dans la base constituée des vecteurs :

Une telle base n’est visiblement pas la plus optimale ! Le vecteur x étant constituée de composantes toutes
égales, on peut écrire directement que :

Seulement, la base n’est pas encore complète, il nous manque 3 vecteurs, qui
devront être orthogonaux :

Ces 4 vecteurs peuvent être représentés


graphiquement selon :

En principe, les vecteurs de base sont normalisés, de sorte qu’on ait au final :

Ce choix de vecteurs définit la Transformée de Haar 1D qui est une des transformées en ondelettes les plus
faciles à implémenter. De cette façon, le vecteur x=(4,2,5,5) s’exprime de manière équivalente par les
coefficients (8, -2, 2/sqrt(2), 0). La 4ème composante étant nulle, seuls les 3 premiers vecteurs sont
nécessaire pour décrire x. Pour ce vecteur, nous pouvons choisir dynamiquement de ne travailler qu’avec
v1, v2 et v3.
En fait, nous pouvons même travailler avec une base de dimension inférieure, et ne considérer que les
vecteurs : w1=(1/sqrt(2), 1/sqrt(2)) et w2=(1/sqrt(2),-1/sqrt(2)).

15
La transformée en ondelettes continue consiste à créer, à partir d’une fonction mère Ψ (l’ondelette) une
famille d’ondelettes Ψ(ax + b), où a et b sont des nombres réels ; a sert à dilater la fonction Ψ, et b sert à la
translater.

La transformée continue C(a,b) de la fonction f(t) s’exprime alors par :

La version discrète de cette transformation ne considère que des dilatations et translations discrètes de
l’ondelette. Traditionnellement, le facteur de dilatation est alors choisi comme une puissance de 2.

Interprétation (transformée de Haar)


Soit à coder la suite de 8 valeurs x = (1,2,3,4,5,6,7,8)
1/ On calcule d’abord les 4 moyennes 2 à 2 : (3/2, 7/2, 11/2, 15/2). Ces termes représentent de manière
grossière (moyenne) la séquence
2/ On calcule ensuite les 4 différences : (-1/2, -1/2, -1/2, -1/2). Ces termes de différences sont aussi appelés
les détails de la séquence
3/ On réitère ces 2 opérations sur (3/2, 7/2, 11/2, 15/2, -1/2, -1/2, -1/2, -1/2). On obtient alors la nouvelle
séquence : (10/4, 26/4, -4/4, -4/4, -1/2, -1/2, -1/2, -1/2)
4/ On réitère une dernière fois les 2 opérations sur le nouveau vecteur :
(36/8, -16/8, -4/4, -4/4, -1/2, -1/2, -1/2, -1/2)
Les différences (détails) de la séquence sont des petits nombres, facilement encodables ensuite par RLE ou
Huffman

La séquence obtenue (36/8, -16/8, -4/4, -4/4, -1/2, -1/2, -1/2, -1/2) fait apparaître le principe d’analyse
multirésolution, celles-ci étant successivement de 4, 2 et 1.
La transformée de Haar (vue précédemment) est obtenue en normalisant chacune de ces valeurs par la racine
carrée de leur résolution.

16
17
Transformée de Haar :
Le JPEG-2000 existe en mode avec ou sans pertes, et
exploitent les transformées en ondelettes vues
précédemment.

Lors de compressions avec pertes, le JPEG-2000 est


plus performant que le JPEG : pour une qualité
d’image égale, JPEG-2000 fournit des fichiers de
taille inférieure. Il est communément admis que les
contours nets et contrastés sont mieux rendus en
JPEG-2000.
Le principe du JPEG-2000 suit les mêmes lignes que
celles du JPEG, à l’exception de :
- la transformée utilisée : ondelettes de Daubechies
- le codage entropique utilisé : méthode MQ (codage
arithmétique)

Compression de Videos
Soit une vidéo de résolution 720x576 (format PAL), dont chaque pixel est codé sur 24 bits, possédant une
cadence de 25 images par seconde. Le débit brut nécessaire pour l’écriture (et la lecture) du fichier est de :
720x576x24x25 = 237 Mbits/s
Pour une vidéo haute définition (HDTV), de résolution 1920x1080 : 1920x1080x24x25 = 1.15 Gbits/s !!!

• 1ère idée : on compresse de manière indépendante chacune des images constituant le flux vidéo. C’est le
format MJPEG (Motion JPEG), qui est parfois utilisé lorsqu’on a besoin de pouvoir accéder de manière
aléatoire à chacune des images (montage vidéo). On utilise donc ici uniquement la redondance spatiale de
l’information.
• 2nde idée : deux images qui se suivent dans une séquence vidéo sont quasiment identiques. On parle alors
de redondance temporelle. Le but alors est de ne stocker uniquement ce qui est modifié d’une image à une
autre.

Aujourd’hui, une séquence vidéo ne se compose pas uniquement d’une succession d’image, mais inclue très
souvent également du son. Lors de la compression, il y a donc deux flux à gérer.
Les normes de compression qui seront présentées dans la suite sont donc constituée de 3 parties:
- une partie vidéo, que nous allons détailler,
- une partie son, qui n’est pas l’objet de ce cours,
- une partie système qui gère l’intégration des deux premiers flux.

Les différents formats : un peu d’histoire

•1989 : première méthode de compression / décompression (codec). Cette méthode fût popularisée par Sony
qui l’utilisa dans sa première Playstation comme moteur de décompression de données.
•1990 : le groupe MPEG (Motion Picture Experts Group) standardise le premier système numérique de
qualité VHS, le MPEG1.
•1994 : le groupe MPEG définit la norme de seconde génération MPEG-2. Cette norme est aujourd’hui la
plus utilisée, depuis les DVD Vidéo jusqu’à la télévision Haute Définition (HDTV)
•1998 : le standard MPEG-4 (aussi appelé H.264) fait son apparition. Il est aujourd’hui utilisé dans le format
Blu-Ray Disc, ou prochainement exploité pour la TNT HD.

Techniques communes au MPEG 1/2/4

Les données vidéo : dans le flux vidéo, les données sont hiérarchisées d’une manière bien précise. Tout
d’abord, en terme de représentation des couleurs.

18
Ensuite, le découpage des images à traiter.
Un macrobloc couvre 16 x 16 pixels dans
l’espace de luminance, et 8x8 pixels dans
l’espace de chrominance.

La compression MPEG : on distingue 2


méthodes de compression, selon que l’on
traite la redondance spatiale ou temporelle
des séquences d’image. Pour cela, on est
amené à considéré trois types d’image :
- les images I (intracodées),
- les images P (prédictives),
- et les images B (bidirectionnelles).

Les images I : il s’agit d’images


complètes codées selon l’algorithme
JPEG vu précédemment. Typiquement,
une image I est intercalée dans le flux
toutes les 10 à 15 images, c’est à dire qu’on trouve 2 à 3 images 1 par seconde dans un flux MPEG. Elles ont
pour objectif :
- d’assurer une diffusion multi-destinataire (broadcasting) : un utilisateur peut se connecter à tout moment au
flux.
- d’assurer qu’en cas d’erreur, il soit possible quand même de continuer la lecture. Il faut pour cela attendre
la prochaine image I.
- d’assurer la lecture avant ou retour rapide, sans que le décodeur n’ait besoin de décoder l’ensemble des
images du flux

Codage spatial de l’information

Les images P : ces images sont codées par rapport à l’image précédente. Elles ne codent donc que la
différence bloc par bloc de l’image précédente. Pour maximiser le taux de compression, on cherche donc
dans l’image précédente un macrobloc identique ou semblable.
En conséquence, les images P peuvent être vues comme une mosaïque :
- de blocs composés d’un vecteur (pour indiquer ou se situait le bloc dans l’image précédente)
- et de blocs complets correspondant aux zones inexistantes dans l’image précédente
Trouver le vecteur de déplacement d’un bloc d’une image à l’autre est appelé compensation de mouvement.

19
Codage temporel de l’information

Compensation de mouvement : la norme MPEG ne spécifie pas comment faire la recherche de blocs
similaires entre 2 image, ni où la faire dans l’image, ni le seuil de ressemblance à atteindre. Il existe
différentes méthodes de recherche traditionnellement utilisées :
- similitude de blocs (block matching),
 La recherche de blocs semblables n’est lancée que si les 2
blocs dans les 2 images à la même position sont suffisamment
différents.
 Les blocs semblables sont recherchés dans un voisinage, et
seulement sur la luminance

- similitude de gradients (gradient matching),


- similitude de phase (phase correlation)

Prédiction de l’erreur : les mouvement dans l’image sont souvent plus complexes que de simples
translations. Ainsi, la prédiction obtenue par compensation de mouvement n’est pas suffisante. De ce fait, on
code également l’erreur de prédiction.

20
Les images B : imaginons une séquence ou un personnage
ouvre une porte. Le codeur n’a aucun moyen de prévoir ce
qui sera derrière cette porte ! Il est donc nécessaire de
construire des images “de type P” en se basant sur les images
futur. La recherche d’un correspondant se fait donc soit sur
l’image précédente, soit sur l’image suivante. Les images de
type B peuvent se référer à une image de type I ou P, mais
jamais à une autre image B.

Composition du flux vidéo :

Mais ce n’est pas ce qui est écrit dans lefichier !

Cette figure
montre
également que
les places
respectives
occupées par les
images de type I,
P ou B.

Comparaison
des normes

MPEG-1 :
principe décrit précédemment, avec une résolution de 320x240, avec un maximum de 30 images/s, les
images devant être en mode progressif (format plein), couleurs en 4:2:0. La partie audio est codé en MPEG-1
Audio Layer I, II ou III (MP3 pour ce dernier).

MPEG-2 : permet la compression d’images entrelacées (télévision numérique), et autorise l’emploi de 4


résolutions (352x288 jusqu’à 1920x1152). MPEG-2 définit également des profils, sélectionnant des
compressions sans images B, des choix différents pour les couleurs, ou des débits différents. Le multiplexage
de données est plus général également : sous-titres, etc.

MPEG-4 : cette norme ajoute un aspect multimédia interactif et se veut plus générique qu’une simple
méthode de compression vidéo. Elle définit des
objets audiovisuels.

Techniques spécifiques au MPEG-2/4 et


améliorations

Quartel-pel : le mouvement d’une image à une autre


n’est pas forcément décrit par un nombre entier de
pixel. L’idée est donc de travailler avec des quart
de pixels extrapolés selon un algorithme bilinéaire ou
bicubique.

21
Global Motion Compensation (GMC) : l’objectif ici est de chercher un effect global dans la vidéo
translations, changement de perspective, rotations, etc.). La GMC permet de définit des points d’ancrage liés
au mouvement de l’image.
Quantification adaptative : la table de quantification est adaptée à
chaque bloc à traiter
4MV : pour le MPEG-4, les macroblocs 16x16 sont subdivisés en 4
blocs 8x8, chacun possédant son propre vecteur de compensation.

22