3->Codage Jpeg

Transcription

3->Codage Jpeg
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
3
2
4
5
Coefficients
Coefficients
Mot
d'Huffm ann
Coeff. DC
BF
Un seul bloc de
8x8 pixels ou
coefficients
Coeff. AC
HF
Suivant une table de
quantification:
Ordonnem ent des coefficients
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.
Image
originale
DCT
DC AC AC AC...
AC AC AC
AC AC
AC
...
FILTRE
Filtre PB: on
ne laisse que
le coeff . DC
DC 0
0 0
0 0
0
...
0
0
0...
DCT-1
Affichage
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');
>> mean(mean(z3))
%energie coeff. DC + AC
%moyenne
ans =
337.7911
>> z4 = blkproc(z,[8 8],'energie');
>> mean(mean(z4))
%energie coeff. DC seulement
%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
12
14
14
18
24
49
72
11 10 16 24 40
12 14 19 26 58
13 16 24 40 57
17 22 29 51 87
22 37 56 68 109
35 55 64 81 104
64 78 87 103 121
92 95 98 112 100
51 61
60 55
69 56
80 62
103 77
113 92
120 101
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:
où
En matlab cela donne:
>>d=255;
%amplitude max d'un pixel
>>eqm=mean(mean((abs(originale-reconstruite))^2));
>>psnr=10*log10((d^2)/eqm)
%moyenne sur 2 dimensions
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