1. Master GE Compression d’images TP1
COMPRESSION JPEG
Objectif
L’objectif du TP est la réalisation des étapes du codeur JPEG sous Matlab. On demande de
programmer les différents blocs pour réaliser une compression de l’image.
Principale étape de compression
Le principe de base de la compression JPEG consiste à effectuer sur chaque bloc LxL de l’image
(L=8 pour la norme JPEG) les opérations représentées sur le schéma suivant :
1) Ecrire une fonction, que l’on appellera "coder.m" qui regroupe les étapes suivantes :
calculer la DCT d’une image Img (pour cela on utilisera la
fonction Matlab "dct2.m").
calculer les indices de quantification sur les blocs
transformés de taille LxL.
retourner l’ensemble des blocs transformés indicés (dans une matrice de mêmes
dimensions que l’image originale).
La syntaxe d’appel de cette fonction devra être : [ImgTr] = coder(Img,L,Q).
Pour les tests, on écrira un programme principal qui utilise cette fonction, et on prendra une
matrice de quantification standard donnée par :
2) Ecrire la fonction de décodage : [ImgRec] =decoder(ImgTr,L,Q) qui :
pour chaque bloc d’indices (pixels transformés), multiplie
ceux-ci par les pas de quantification correspondants
(multiplication de matrices point à point) pour obtenir le
bloc transformé quantifié,
puis on calcule la DCT inverse (idct2.m).
3) Ecrire la fonction [D]=distimage(Img,Imgrec) qui calcule la distorsion moyenne (écart
quadratique moyen) entre l’image originale et l’image reconstituée.
4) On demande de tester ces fonctions sur une image pour différentes matrices de
quantification Q :
avec une quantification optimale utilisant la matrice de ‘pas’ définie dans le standard
JPEG.
Q_Stand=
[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]
2. Master GE Compression d’images TP1
avec une quantification uniforme : Q= q*ones(L,L) où q=5.
avec des versions dégradées de ces matrices (c'est-à-dire avec des pas de
quantification multipliés par un facteur 2p
, à essayer pour p = 1 (réduction d’un bit
par pixel a priori) ou p= 2 (réduction de 2 bits par pixel).
5) Calculer et tracer l’histogramme des indices de quantification obtenus.
Interpréter cet histogramme en mettant l’accent sur les points suivants :
estimation du nombre de bits nécessaires (sans faire appel à une technique de codage
sans pertes) pour transmettre à priori les indices de quantification (pixels
transformés).
remarque sur le nombre de valeurs nulles.
Les autres étapes de la compression JPEG
Le schéma complet d’une chaine de codage –décodage JPEG peut être représenté comme suit :
1) Lecture en zigzag et Run Length Coding
Chacun des blocs DCT quantifiés obtenus est lu en zigzag, de manière à regrouper les
coefficients non nuls.
La fonction donnée ci-après permet d’effectuer un zigzag sur les indices d’une matrice carrée
M de NxN éléments, pour l’utiliser on écrit R = M(zigzag(N)).
function ind = zigzag(N);
K = 2;
M = N-1;
ind = zeros(1,N*N);
for i=[1:M];
ind(K:K+i) = [(1+M*rem(i,2)), (-1)^i*M*ones(1,i)];
K = K+i+1;
end
for i=[M-1:-1:0]
ind(K:K+i) = [(N-M*rem(i,2)), (-1)^i*M*ones(1,i)];
K = K+i+1;
end
ind = cumsum(ind)+1;
return
3. Master GE Compression d’images TP1
a. expliquer les étapes de cette fonction
b. introduire cette fonction dans le programme de compression
c. écrire une fonction pour réaliser le codage RLC (de type {longueur plage nulle, valeur})
d. appliquer le codage RLC sur les coefficients calculés par la fonction coder( )
2) Codage sans pertes – Codage de Huffman
Le programme ci-contre permet de faire un codage de Huffman des coefficients Im_dctq
a. Expliquer les étapes de cette fonction.
b. Introduire cette fonction dans le programme de codage complet.
c. Faire des expérimentations sur des images pour vérifier l’effet de la compression
JPEG.
temp=1
temp2=0
[row, col] = size(Im_dctq);
pixel_count = row*col;
symbol = reshape(Im_dctq,[1,row*col]);
symbol1 = unique(symbol);
len = length(symbol1);
for i = 1:len
k = Im_dctq==symbol1(i);
count(temp) = sum(k(:));
prob_pix(temp) = double(count(temp)/pixel_count);
temp2 = temp2 + prob_pix(temp);
prob_cum(temp) = temp2;
temp = temp+1;
end
[dict,avg_len] = huffmandict(symbol1,prob_pix);