Sie sind auf Seite 1von 3

ST4-CN2 : Codage de Source Sujet remis par P.Jardin.

(plusieurs fonctions ont t gracieusement fournies par J.F.Bercher).

TP COMPRESSION DIMAGES
On se propose dexaminer lors de cette sance de travaux pratiques la mise en uvre dune mthode de compression
dimages de type JPEG. Nous pourrons ici prendre certaines liberts par rapport la stricte norme JPEG (processus de
fond), de manire simplifier limplantation, ou mettre en vidence les caractristiques de la mthode de compression.
Il nen reste pas moins que le but du TP est dobtenir une vritable mthode de compression, cest--dire, partant dune
image, construire un train binaire (un ensemble ordonn de bits), dont le dcodage permet de retrouver une image
proche de limage initiale.
Le TP sera ralis sous Matlab. On fournit un certain nombre de fonctions. Dautres devront tre ralises par vos soins.
Des images, de diffrentes tailles, sont disponibles au format PGM (Portable GrayMap). Il sagit dimages en niveaux
de gris, sur 8 bits, soit 256 niveaux. La fonction getpgm permet de charger ces images sous la forme dune matrice. La
commande Img=getpgm(bird.pgm) ; permet par exemple de charger limage bird.pgm dans la matrice Img. La
fonction imagesc (image scaled) permet dafficher une image en exploitant toute lchelle fournie par la colormap.
Dans notre cas, pour afficher en niveaux de gris, il faudra choisir colormap(gray).
Le standard prvoit de centrer lchelle des niveaux de gris [-128,127]. Vous appliquerez donc : Img=Img-128 ;
Images disponibles : bird.pgm, boat.pgm, frog.pgm, lena.pgm, mandrill.pgm, peppers.pgm.

Principale tape de compression


Le cur de la compression JPEG consiste effectuer sur chaque bloc LxL de limage (L=8 pour la norme JPEG) les
oprations reprsentes sur le schma suivant :

Transmission
Bloc ./Q des indices de DCT Bloc
8x8 DCT arrondi quantification .*Q inverse 8x8

Travail demand :
a) crire une fonction cod1.m qui calcule la DCT(dct2.m), sur des blocs de taille LxL dune image Img, calcule
les indices de quantification sur les blocs transforms (cette opration peut seffectuer sur lensemble du bloc
transform par une division de matrices point point) et retourne lensemble des blocs transforms indics
(dans une matrice de mmes dimensions que limage originale) La syntaxe dappel de la fonction cod1 devra
tre : [ImgTr] = cod1(Img,L,Q) ;
b) Ecrire la fonction de dcodage : [ImgRec] =decod1(ImgTr,L,Q) qui, pour chaque bloc dindices (pixels
transforms), multiplie ceux-ci par les pas de quantification correspondants (multiplication de matrices point
point) pour obtenir le bloc transform quantifi et opre la DCT inverse (idct2.m ).
c) Ecrire la fonction [D]=distimage(Img,Imgrec) qui calcule la distorsion moyenne (cart quadratique moyen)
entre limage originale et limage reconstitue.
d) Vous testerez ces fonctions sur une des images disponibles pour diffrentes matrices de quantification Q :
- avec une quantification optimale : Q=stdQ (la fonction stdQ retourne la matrice de pas dfinie dans le standard
JPEG).
- avec une quantification uniforme : Q= q*ones(L,L) o q est la valeur moyenne des pas de quantification de
stdQ.
- avec des versions dgrades de ces matrices (c'est--dire avec des pas de quantification multiplis par un
facteur 2p, essayer pour p = 1 (rduction dun bit par pixel a priori) ou p= 2 (rduction de 2 bits par pixel).
Vous commenterez les rsultats obtenus et tudierez en particulier la dpendance des distorsions objective
(mesure par D) et subjective (ce que vous voyez) en fonction du choix de la matrice de quantification.
e) Calculez et tracez lhistogramme des indices de quantification obtenus. Vous interprterez cet histogramme :
- estimation du nombre de bits ncessaires (sans faire appel une technique de codage sans pertes) pour
transmettre priori les indices de quantification (pixels transforms).
- remarque sur le nombre de valeurs nulles
- estime de lentropie de ces indices et r-estimation du nombre de bits par pixel a priori ncessaire (en faisant
appel une technique de codage sans pertes). Pour cette dernire tape vous pouvez vous inspirer du script
gene_code.m utilis dans la suite.
Pour la suite du TP on considrera le cas Q=stdQ (mais il vous sera loisible de tester dautres choix vos moments
perdus)

Autres tapes de la compression JPEG


Le schma complet dune chaine de codage dcodage JPEG peut tre reprsent comme suit :
Transmission
Bloc DCT ./Q zigzag RLC Codage des codes de
8x8 arrondi Huffman Huffman

Dcodage Dcodage D .*Q DCT Bloc


Huffmann RLC zigzag inverse 8x8

1) Lecture en zigzag et Run Length Coding


Chacun des blocs DCT quantifis obtenus est lu en zigzag, de manire regrouper les coefficients non nuls. Un codage
RLC modifi est ensuite effectu.
Les fonctions suivantes sont fournies. La fonction zz.m permet deffectuer la lecture en zigzag. La fonction RLC_jpg.m
retourne une matrice au format RLC de JPEG, savoir [valeur non nulle , nombre de valeurs zro suivantes]. La
fonction codQzzRLC.m ralise ces deux oprations sur les blocs transforms dune image.

Travail demand : Observer les rsultats par tapes de cette fonction sur un bloc dimage (en passant en argument une
portion (8*8) de limage) et en retirant les ; pour afficher les rsultats intermdiaires.

2) Codage sans pertes Codage de Huffmann


Le script gene_code.m applique la fonction codQzzRLC lensemble des blocs de 4 images disponibles afin dobtenir
une base dapprentissage de couples [valeur non nulle , nombre de valeurs zro suivantes] nots (vnz, nbz). Lauteur
de ce texte a ensuite estim pour chacune des grandeurs vnz (valeur non nulle) et nbz (nombre de valeurs zro
suivantes) les distributions de probabilits de ces grandeurs partir dhistogrammes. Ces histogrammes et lentropie qui
leur est associe sont affichs par le script. Enfin la connaissance des distributions de probabilit permet de construire
(grce la fonction standard huffmandict) un dictionnaire (ensemble de mots de code) pour coder chacune de ces deux
grandeurs.
Remarque : dans la norme JPEG cest un dictionnaire unique qui est construit pour des couples de valeurs (vnz,nbz).

Travail demand : Interprter la figure gnre par ce script et dduire des diffrentes grandeurs fournies (entropie, nb
de valeurs RLC pour lensemble des 4 images, nombre de pixels pour lensemble des 4 images) un taux de compression
estim pour la norme JPEG, ou un nombre de bits par pixel. Faire le lien avec la dernire question de la partie
Principale tape de compression .

Les lignes suivantes donnent des exemples dutilisation de ces dictionnaires pour coder et dcoder des valeurs vnz,nbz
de couples RLC laide des fonctions standard huffmanenco.m et huffmandeco.m
%exemple d'utilisation des codes
code_vnz=huffmanenco([1 5 -7 5],dico_huff_vnz) )%codage dune squence de valeurs vnz
vnz=huffmandeco(code_vnz,dico_huff_vnz) %dcodage de la squence code

Travail demand : modifier (complter) la fonction codQzzRLC.m (que vous renommerez codJPEG.m) pour gnrer
les deux trains binaires correspondant aux deux suites de valeurs vnz et nbz codes par codage de Huffman. Vous
calculerez par ailleurs le taux effectif de compression obtenu pour limage traite.
La syntaxe de cette fonction sera :
[codebin_vnz,codebin_nbz,taux]=codJPEG(Img,L,Q,dico_huff_nbz,dico_huff_vnz);
3) Dcodage
Lauteur (trs aimable) de ce texte fournit une fonction de dcodage pour vrifier votre fonction :
[imgrec]=decodJPEG(codebin_vnz,codebin_nbz,L,Q,NB,dico_huff_nbz,dico_huff_vnz)
(NB=size(img)/L doit tre pass en argument de la fonction pour donner le nombre de blocs dcoder).
Lauteur, dcidemment sympathique, fournit aussi le script du programme principal (pas vraiment compliqu) qui
appelle les deux fonctions tout tour. Cest TP_JPEG.m
Vous vrifierez en particulier que vous navez pas introduit de distorsion supplmentaire par cette tape de codage sans
pertes.
Codage trs bas dbit utilisation de la Quantification Vectorielle

Cette partie complte lillustration des mthodes de compression vues en cours en vous proposant de mettre en uvre
une tape de Quantification Vectorielle (QV) sur les vecteurs dindices des blocs transforms lus en zigzag.

Lide de cette partie est de remplacer les tapes suivantes : codage RLC et Huffman par une tape de quantification
vectorielle des vecteurs v sur 10 bits, c'est--dire avec 10/64 bit par pixel
Le schma pour la chaine de codage dcodage devient alors :

Transmisssio dun
./Q 10 QV
Bloc DCT zigzag indice de
8x8 arrondi 2 quantification sur 10
v= bits
Dictionnaire de
0
vecteurs v :
11 0 Dico_zz
1
Bloc
Dcodage v = D .*Q DCT 8x8
QV 0 zigzag inverse
0
Dictionnaire de
vecteurs v :
Dico_zz

Il faut pour mettre en uvre ce codage crer tout dabord le dictionnaire de QV c'est--dire lensemble des 210=1024
meilleurs reprsentants des vecteurs v. Ensuite on peut raliser le codage dcodage suivant le schma de principe
prcdent.
1) Cration du dictionnaire
Suivant le mme principe que celui utilis dans gene_code, le script gene_dico_QV construit un dictionnaire optimal
not dico_zz partir dune base dapprentissage constitue des vecteurs v correspondant lanalyse (DCT, ./Q et
lecture zigzag ) des blocs de 4 images disponibles. Ce script met en uvre lalgorithme LBG itratif vu en TD.
Remarque : ici le nombre de vecteurs obtenus (N4000) nest pas trs grand devant le nombre de reprsentants du
dictionnaire.
Travail demand : Observer les figures gnres par ce script qui montrent dans le plan des 2 premires composantes de
v lvolution des reprsentants ainsi que lvolution de la distorsion au cours de lalgorithme.
2) Codage utilisant la QV
Il sagit de mettre en uvre le dbut de la chaine reprsente ci-dessus qui dlivre la suite des indices des plus proches
reprsentants des vecteurs v issus de lanalyse des blocs dune image
Travail demand : modifier (complter) la fonction codQzz.m (que vous renommerez codQzz_QV.m) pour gnrer la
suite dindices des plus proches reprsentants des vecteurs v (vous utiliserez la fonction ppv pour trouver ces plus
proches reprsentants).
La syntaxe de cette fonction sera : [indice]=codQzz_QV(Img,L,Q,dico_zz);
3) Dcodage
Il sagit de restituer une image dcode partir de la suite dindices (mise en uvre de la fin de la chaine reprsente).
Lauteur de ce texte fournit la fonction de dcodage : [imgrec]=decodQzz_QV(indice,L,Q,dico_zz,NB)
ainsi que le script du programme principal qui appelle les deux fonctions tout tour (TP_QV.m)
Travail demand : Commentez le rsultat obtenu en termes de dbit et distorsion par rapport aux techniques vues dans
la premire partie.

Das könnte Ihnen auch gefallen