Vous êtes sur la page 1sur 17

TP10 Implantation de JPEG avec Matlab

Julien Kronegg (Julien.Kronegg@cui.unige.ch)


http://vision.unige.ch/

CVML, University of Geneva, Switzerland 25 mai 2004

Codage avec pertes


Problme:
le codage sans pertes atteint des taux de compression de lordre de 3:1 compression insuffisante!

Solution:
compression avec pertes (donc taux de compression plus importants) JPEG : compression jusqu environ 25:1 enlever linformation dans les zones o on ne peut pas la voir

Standard JPEG
Spcification par le Joint Photographic Expert Group en 1990 Standard de facto pour les images en millions de couleurs La spcification sert de base lnonc du TP

Modes de compression
Sequential
La mthode dcrite dans le cours (bloc 8x8)

Progressive
Limage saffiche par approximation successives (dabord flou, puis net) Utilis pour le transfert sur rseau

Lossless
Sans pertes Na rien voir avec la compression JPEG (plutt un genre de RLE) Peu utilis

pour le TP, nous utiliserons le mode Sequential

= tape avec pertes

Fonctionnement gnral
image

RGB->YCbCr

Sous-echantillonnage

Blocs 8x8

DCT

Requantification

Rordonancement zig-zag

Codage

fichier jpeg

Matlab : rgb2ycbcr

Fonctionnement (1)
Transformation RGB->YCbCr
Y = 0.299 R + 0.587 G + 0.114 B Cb = -0.1687 R - 0.3313 G + 0.5 B Cr = 0.5 R - 0.4187 G - 0.0813 B original

chaque plan est cod en 8 bits/pixel


red green blue

luminance (Y)

chrominance 1 (Cb)

chrominance 2 (Cr)

Matlab : imresize

Fonctionnement (2)
Sous-chantillonnage
Pourquoi? Gagner de la place bien sr Efficace? En principe non (cf TP3), sauf si on prend des prcautions Que sous-chantilloner ? Cb et Cr mais pas Y (lil davantage sensible la luminance qu la chrominance, cf cours I.2.5.1) Paramtres usuels ( choix de limplmenteur) et utiliss pour le TP :
Y : 1x1 (pas de sous-chantillonnage) Cb : 2x2 Cr : 2x2

ne pas oublier le filtrage passe-bas dans imresize!

Matlab : blkproc

Fonctionnement (3)
Dcoupage des plans de limage en blocs de 8x8 pixels

8x8 = taille de bloc peu prs optimale pour la DCT chaque bloc contient donc 8x8=64 valeurs codes sur 8 bits

Matlab : dct2

Fonctionnement (4)
Calculer la DCT de chaque bloc
DCT( ) = bloc 8x8 contenant les composantes frquentielles du bloc

Le bloc contient une combinaison linaire des images de la base Vecteurs de la base :
Frq horiz

Rsultat: 8x8 valeurs codes sur 12 bits [-1024..1023]


(il existe aussi une version 15 bits que nous nutiliserons pas pour le TP)

Frq vert

soustraire 128 chaque bloc avant de faire la DCT


9

Fonctionnement (5)
Requantification

Matlab : blkproc inline

Chaque valeur du bloc est requantifie (=divise par une constante choisie dans une table prdfinie, cf itu-t81 p.147) Une table de requantification pour la luminance et une pour les chrominances Les table de requantification utilises seront incluses dans le fichier JPEG

10

Codage
Parcours zig-zag Ordre de parcours des plans pour le stockage dans le fichier Mthode de compression sans pertes

11

Zig-zag
Rordonancement zig-zag
La requantification a coup une partie des hautes frquences

Coef. DCT req.

8x8

Donc il y a de grandes variations entre deux valeurs voisines

Le parcours zig-zag permet de corriger a (pas mal de valeurs identiques sont donc voisines aprs)

12

Parcours de limage pour le stockage


Exemple pour une image RGB 64 x 64 pixels, sous-chantillonnage YCbCr 1:1 2:2 2:2 Plan Y
nbr_blocs_horiz = 8 nbr_blocs_par_array_horiz = 2

Plan Cb
nbr_blocs_horiz = 4 nbr_blocs_par_array_horiz = 1

Plan Cb
nbr_blocs_horiz = 4 nbr_blocs_par_array_horiz = 1

Lgende:

data unit (=bloc de 8x8 pixels)

Pour tous les plans :

array of data unit


(contenant un nombre de data unit variant selon le plan)

imagewidth nbr_arrays_horiz = blocwidth max ( facteur_sous_echplans )


Pour chaque plan :

sens de parcours on ne peut pas utiliser blkproc pour le parcours cause de lordre de parcours du plan Y et de lentrelacement des plans

nbr_blocs_horiz =

imagewidth blocwidth facteur_sous_echplan

nbr_blocs_par_array_horiz =

max ( facteur_sous_echplans ) facteur_sous_echplan


Y Cb Cr

Ordre de parcours : un array of data unit la fois, avec entrelacement des plans

Y Cb Cr

Y Cb Cr

...

13

Compression dun bloc


Codage
Etape de compression proprement parler (sans pertes) Codage hybride (bas sur : prdictif, RLE, Huffman) Chaque composante (AC ou DC) du bloc est code squentiellement dans le fichier (aprs le header)

DC

AC

Prdictif+Huffman pour la composante DC


DC = composante continue (=coefficient de la couleur moyenne du bloc) 1 coefficient

RLE+Huffman pour les composantes AC


AC = composante frquentielle de chaque bloc (=hautes frquences) 63 coefficients
14

Composante DC
Codage prdictif
calcul de la diffrence DIFF = coef_DC_courant - coef_DC_precedent un coefficient DC prcdent par plan!

Codage de Huffman

cf. spec JPEG p. 93 pour le calcul

catgorie damplitude (SSSS) pour chaque valeur correspondant au nombre de bits sur lequel on peut coder cette valeur SSSS bits codage :
SSSS DIFF Codage de Huffman :
len = table(SSSS+1, colN) code = table(SSSS+1, colV) write_bits(len, code, file_handle) SSSS 0 1 2 3 4 ... Nbr bits 2 3 3 4 5 ...

Exemple de table de Huffman


Valeur 0b00 0b100 0b101 0b1011 0b1101 ...

colN et colV dsignent les indices des colonnes Nbr bits et Valeur les indices commencent 1 en Matlab (do SSSS+1) 12 catgories damplitude => table de Huffman 12 entres une table de Huffman pour la luminance DC et une pour la chrominance DC il y a 2 write_bits faire : 1 pour SSSS avec Huffman et 1 pour DIFF sans Huffman

15

Composante AC
RLE
calcul du nombre de 0 conscutifs (=0..63) = RRRR

Huffman
calcul de la catgorie damplitude (SSSS) 4 bits 4 bits du coefficient AC suivant une plage de 0 index dans la table de Huffman : 8 bits => 256 entres RRRR SSSS RRRRSSSS = 16 RRRR + SSSS colN et colV dsignent les indices des colonnes codage :
SSSS bits RRRRSSSS Coef. AC
Nbr bits et Valeur les indices commencent 1 en Matlab (do SSSS+1) RRRR cod sur 4 bits => max 15 zros conscutifs en RLE index RRRRSSSS spciaux : 0x00 = tous les coefficients AC suivant sont 0 0xF0 = une plage de 15 coefficients AC 0 avec un coef de 0 bits aprs (donc 16 coefs zro!!!) une table de Huffman pour la luminance AC et une pour la chrominance AC il y a 2 write_bits faire : 1 pour RRRRSSSS avec Huffman et 1 pour le coef AC sans Huffman 16

Codage de Huffman :
len = table(RRRRSSSS+1, colN) code = table(RRRRSSSS+1, colV) write_bits(len, code, file_h)

DC AC

Exemple pour ltape 2


On crit dans le fichier : 0b1110 0b000111 0b1010

[-56 ] [-56 ] [-56 ] (=dbut de rgb_32x32.png)


on crit le coefficient DC du 1er bloc :
coef=-56 => diff=-56-0=-56 diff=-56 => SSSS=6 => Huffman : len=4, code=0b1110 (14) diff sur SSSS bits=0b000111

on crit les coefficients AC (fin de bloc, EOB) du 1er bloc :


RRRRSSSS=0 => Huffman : len=4, code=0b1010 (10)

on crit le coefficient DC du 2me bloc :


Si ce byte est faux, vous vous tes probablement tromp de table de Huffman: cest la table de chrominance quil faut utiliser pour le plan Cb/Cr

coef=-56 => diff=-56-(-56)=0 diff=0 => SSSS=0 => Huffman : len=2, code=0b00 (0) diff sur SSSS bits= 0b (0 bits)

0b00

on crit les coefficients AC (fin de bloc, EOB) du 2me bloc :


RRRRSSSS=0 => Huffman : len=4, code=0b1010 (10) 0b1010 0b00 1010 0xE1 0xE8 0xA2 1110 000111 1010 00 1010 00 1010

idem pour le 3me bloc

Au final, il y a dans le fichier :

(environ la position 607) Le contenu complet pour toute limage: E1 E8 A2 8A 00 E8 68 A2 8A F3 4F B5 37 E8 A2 8A F3 8F C7 8E 32 8A 28 AF D6 0F A4 FF D9 17