Vous êtes sur la page 1sur 7

TP 3 de Compression

Sujet: La Norme JPEG de compression des images fixes


S7 Master 1 Audiovisuel et Multimédia - ISIS – Clément FOLLET – Avril 2008

Travail préparatoire:

a) Processus de codage/décodage JPEG Baseline:

1
2 3 4 5
Coefficients Coefficients

Mot
d'Huffm ann

Coeff. DC Coeff. AC
BF

HF
Un seul bloc de
8x8 pixels ou
Suivant une table de Ordonnem ent des coefficients
coefficients
quantification: suivant un ordre prédéfini:

b)

1ère étape:
On divise l'image en blocs de 8x8 pixels.

2ème étape:
On applique une Transformée en Cosinus Discrète à chacun des blocs. On obtient alors des
coefficients représentant les différentes fréquences de l'image pour un canal donné. En haut à
gauche se trouve les basses fréquences, en bas à droite les hautes fréquences.

3ème étape:
On quantifie différement les coefficients suivant la fréquence. Dans la norme JPEG il existes 4
tables de quantification différentes suivant la compression voulue. Cette technique a pour but de
supprimer les hautes fréquences, qui sont moins visibles par l'oeil humain ( voir courbe Nill).

4ème étape:
On classe les coefficients suivant un ordre en zig-zag.

5ème étape:
On procède au codage entropique, c'est à dire que l'on passe d'une suite de coefficients à une suite
de zéros et de uns:
On code le coefficient DC du bloc traité en le soustrayant au coefficient DC du bloc précédent. On
appelle ça un codage différentiel.

TP3 de com pression – Master 1 DREAM Valenciennes – Avril 2008 – page 1


Ensuite on code les coefficients AC, pour éliminer les coefficients à zéro on regarde dans la table
d'Huffman ci-dessous le nombre de zéros avant un coefficient non nul ainsi que la catégorie du
coefficient non nul, on obtient alors un premier code, auquel on ajoute le code donnant la position
du nombre dans la catégorie.

Après zig-zag

On obtient désormais le mot d'Huffman différentiel. Pour le décodage on effectue les mêmes étapes
dans le sens inverse.

c) Les pertes sont dûes à la quantification où l'on est obligé d'arrondire à l'entier le plus proche,
lorsque l'on fait le décodage, les valeurs de l'image d'origine ne sont donc pas retrouvées. On
exploite les redondances fréquentielles de l'images ainsi que les redondances entre chaque bloc des
coefficients DC.

d) C'est principalement la table de quantification qui permet de modifier le taux de compression.

1)La Transformée en Cosinus Discrète.

Propriétés de base de la DCT (voir fichiers dctav.m et idctav.m)

Il s'agit d'implémenter la DCT à une dimension de taille 8, sous forme de produit matrice-vecteur.

Calcul de la DCT via une FFT (voir fichier fft2dct.m)

TP3 de com pression – Master 1 DREAM Valenciennes – Avril 2008 – page 2


Là il s'agit d'appliquer la fonction fft de Matlab sur 2N échantillons (échantillons (0 à N) + zéros (N
+1 à 2N)), de multiplier les N premiers échantillons par exp(-i*2*pi*k/(4*N), puis de prendre la
partie réelle et la multiplier par Ck et racine(2/N).

La DCT à deux dimensions

Questions:
1.La propriété utilisée dans la fonction dct2.m est que l'on applique deux DCT unidimensionnelle,
une suivant les lignes, puis suivant les colonnes.

2.Dans la fonction dct.m (voir fichier dct,m), on retrouve le principe de calcul de la DCT
unidimensionnel cas impair. C'est à dire que si la fonction rem retourne 1 (cas impair,n/2 non
entier), on double le nombre d'échantillons pour avoir n pair. On a la matrice originale de 1 à N et la
matrice flippée (inversée) de N+1 à 2N.

3.La fonction dct ne fait le calcul que suivant les colonnes, il faut utiliser la fonction dct2.

4.

image originale mesh(sampl1) mesh(dct2(sampl1))

On remarque que l'image ne contient principalement que des basses fréquences.

Description du noyau de la transformée bidimensionnelle (voir fichier vecteurs.m)

Formule de la DCT à deux dimensions:

[X]=[phi].[x].transposée[phi]

On veut retrouver la matrice de transformation (ou noyau) phi sans calcul, en utilisant la fonction
idct2 pour faire ressortir chaque vecteur en fonction de k,l .
Pour trouver phi(k,l), il faut que X(0,0)=1 et le reste soit à 0, puis que X(1,0)=1 et le reste à 0, et
ainsi de suite...
On rempli une matrice phi de 64 blocs de 8*8 pixels qui correspondent à chaque idct2(X(k,l)).

On obtient:
BF

HF
TP3 de com pression – Master 1 DREAM Valenciennes – Avril 2008 – page 3
Traitement de l'image par bloc (voir fichiers dctprog, filtrepdc, filtrepdc3ac, energie.m)

L'image est découpées en blocs de tailles 8x8 pixels pour appliquer à chacun d'entre eux une DCT.

L'instruction blkproc permet de découper une images en plusieurs blocs de taille [M N] et


d'appliquer une fonction à chacun de ces blocs, ici on utilisera la fonction dct2.

>> load sampl1.mat


>> x = sampl1;
>> imshow(x,gray(256))
>> y = blkproc(sampl1,[8 8],'dct2');
>> imshow(y,gray(256))

On obtient:
DCT

L'image étant très uniforme dans les noirs, on observe des pics « blancs » pour les basses fréquences
de chaque bloc.

2. On veut maintenant représenter l'énergie moyenne de chaque bloc, pour cela on créer une
fonction 'energie' qui fait la moyenne du carré de la DCT:

function[z]= energie(x)

xcarr=x.^2;
z=mean(mean(xcarr)); %deux fois à cause de la 2D

On regarde l'image en annulant les coefficients AC et identifier le pourcentage d'énergie contenu en


moyenne dans les coefficients DC.

DC AC AC AC... DC 0 0 0...
Image DCT
AC AC AC 0 0 0
DCT-1 Affichage
AC AC FILTRE 0 0
originale AC 0
... ...
Filtre PB: on
ne laisse que
le coeff . DC

TP3 de com pression – Master 1 DREAM Valenciennes – Avril 2008 – page 4


function[z]= filtrepdc(x)

z=zeros(8,8);
z(1,1)=x(1,1);

>> load sampl1.mat


>> y = blkproc(sampl1,[8 8],'dct2');
>> z = blkproc(y,[8 8],'filtrepdc');
>> z2 = blkproc(z,[8 8],'idct2');
>> imshow(z2,gray(256))

energie:
>> z3 = blkproc(y,[8 8],'energie'); %energie coeff. DC + AC
>> mean(mean(z3)) %moyenne

ans =

337.7911

>> z4 = blkproc(z,[8 8],'energie'); %energie coeff. DC seulement


>> mean(mean(z4)) %moyenne

ans =

282.5740

On obtient un pourcentage d'energie des coeff. DC de 283*100/338=83% de l'énergie. Ce qui est


beaucoup!

*De la même manière on filtre en gardant les coeff. DC mais en gardant aussi les 3 coefficients AC
voisins du DC.

>> y = blkproc(sampl1,[8 8],'dct2');


>> z = blkproc(y,[8 8],'filtrepdc3ac');
>> z2 = blkproc(z,[8 8],'idct2');
>> imshow(z2,gray(256))
>> z3 = blkproc(z,[8 8],'energie');
>> mean(mean(z3))

ans =

316.4551

Ce qui représente 316*100/338=93% de l'énergie totale.

3. On réalise maintenant un programme dctprog.m qui va afficher au fur à mesure l'image avec plus
de détails. C'est à dire en prenant 1 puis 4, 9, 16, 25, 36, 49, 64 premiers coefficients en fréquences
de chaque bloc, séparé par une temporisation pour mieux visualiser l'influence des coefficients.

Lignes de commandes:
>>load lena512

TP3 de com pression – Master 1 DREAM Valenciennes – Avril 2008 – page 5


>>dctprog(lena512)

Rmq: le programme dctprog fait appel à la fonction filtreprog.

2)La quantification, clef de la compression

Etude de la quantification (voir fichier codec.m)

1. On charge la table de quantification matquant.mat

>> load matquant.mat


>> matquant

matquant =

16 11 10 16 24 40 51 61
12 12 14 19 26 58 60 55
14 13 16 24 40 57 69 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99

Cette table atténue les hautes fréquences d'un rapport 7 par rapport aux basses fréquences. L'oeil
étant moins sensible aux hautes fréquences.

2. Il s'agit de charger une image, de lui appliquer toutes les étapes de la compression (DCT,
quantification directe, puis inverse, et DCT inverse. Les opérations sont écrites dans le fichier
codec.m qui fait appel aux fonctions dct2.m, quantifdirecte.m, quantifinverse.m et idct2.m. On
utilise la matrice de quantification matquant.mat. Cette matrice peut être multipliée par un facteur c
dans la ligne de commande pour visualiser les pertes dûes aux arrondis entre quantification directe
et quantification inverse.

3-4. Le programme affiche l'image originale, l'image compressée/décompressée puis l'image


d'erreur qui est défini par la relation:

erreur = 128 + 2(originale – reconstruite)

ligne de commande:
>>load lena512
>>codec(lena512,8)

TP3 de com pression – Master 1 DREAM Valenciennes – Avril 2008 – page 6


On prend un facteur (8) multiplicateur de table de quantification très important pour bien mettre en
évidence le phénomène.
On remarque sur l'image d'erreur que les erreurs se trouvent surtout sur les contours, donc sur les
petits transition, les détails, qui sont faits de hautes fréquences. L'arrondi a plus d'influence sur les
hautes fréquences d'autant plus que les coefficients de la table sont réduits en hautes fréquences.

5-6. On reporte les mesures du rapport signal à bruit calculé par le programme dans un tableau
comparant trois images avec 4 facteurs de table de quantif' différents.
Le psnr est donné par la formule:


En matlab cela donne:
>>d=255; %amplitude max d'un pixel
>>eqm=mean(mean((abs(originale-reconstruite))^2)); %moyenne sur 2 dimensions
>>psnr=10*log10((d^2)/eqm)

Le tableau:
Facteur qualité psnr(LENA)
0,5 13,35
1 11,50
2 9,52
4 7,07
Rmq: Un bon psnr en image est de 30 à 40 dB, on l'obtient pour un facteur qualité de 0,01.

3) Le codage entropique des coefficients DCT quantifiés

Il s'agit d'implémenter dans un programme codentropik.m les étapes du codage entropique:


– zigzag
– différence entre les coeff. DC sauf premier de chaque ligne
– codage des coeff. AC (élaboration du nombre I: nombre de zéros précédents + valeurs non
nulle)
– codage à longueur variable de Huffman suivant la table dans le fichier table.mat (norme
ISO/JPEG)
Les fichiers associés à codentropik.m sont dct2.m, matquant.mat, quantifdirecte.m, zigzag.m,
dcdiff.m, zerocat.m, huffman.m, signamp.m, table.mat.
Il faut aussi ajouter les 2 symbôles supplémentaires, les 16 zéros à la suite, et le End Of Block.

Résultats:
Facteur qualité débit(bits/pixel)
0,1 2,19
0,5 1,03
1 0,66
2 0,37
4 0,30
8 0,29

TP3 de com pression – Master 1 DREAM Valenciennes – Avril 2008 – page 7

Vous aimerez peut-être aussi