Académique Documents
Professionnel Documents
Culture Documents
01-01-2011
III.
IV.
V.
VI.
VII.
VIII.
Introduction
Rappel sur limage numrique
II.1 Dfinition
II.2 Notions de pixel et espace de couleur
Rappel sur la compression des images
III.1 Compression sans pertes
III.2 Compression avec pertes
III.3 Processus gnral dun codec dimages fixes
Notions sur la transform DCT
IV.1 Dfinition
IV .2 Variantes de la DCT
IV .2.a DCT I
IV .2.b DCT II
IV .2.c IDCT
IV.3 Proprits de la DCT en compression dimage
IV.3.a Dcorrlation
IV.3.b Concentration des coefficients
IV.3.c Symtrie, sparabilit, et orthogonalit
Processus gnral dun codec JPEG dimages fixes
V.1 Dfinitions
V.2 JPEG base sur la DCT squentielle
V.2.1 Dcoupage en sous blocs
V.2.2 Dcalage de niveau (Level Shifting)
V.2.3 Application de la DCT
V.2.4 Quantification
V.2.5 Codage des coefficients DC et AC
V.2.5.a Les coefficients DC
V.2.5.b Les coefficients AC
V.2.6 Codage Huffman
Mise en uvre sous Matlab
VI.1 Reprsentation des images sous Matlab :
VI. 2 Code final
VI.3 Rsultats
Conclusion
Rfrence
I. Introduction :
De nos jours, les images numriques sont omniprsentes dans notre
quotidien(photographie numrique, web, imagerie mdicaleetc), leurs utilisations sous
format brut rendent leurs portabilits difficiles (temps de transmission long) et leurs
stockages encombrant (ncessit de plus de mmoire) ce qui revient un cout lev, cest
pour cela quil a fallu trouver de nouvelles techniques de compression et codage dimage
adaptes.
Grce aux progrs atteint dans la thorie du codage et de la compression des donns, les
images peuvent maintenant tre compresses en faisant enlever ce qui est redondant sur la
base dalgorithmes de compression intelligents en exploitant plusieurs aspects technique
prsents sur les donnes de limage (redondance psychovisuel, interpixel..) afin de rduire
le poids de limage, cela nous fera gagner de lespace en mmoire et une augmentation du
dbit de transmission (temps de transmission moins long). Aujourdhui, on trouve plusieurs
algorithmes de compression dimages comme par exemple: .jpg ou .jpeg, .png, .gif, .tiff,
jpeg2000 etc
Dans ce projet, nous allons essayer de revoir le principe de lalgorithme de compression
JPEG en mode opratoire squentielle, et enfin sa mise en uvre pratique de base sur
une image fixe monochrome laide du logiciel Matlab.
Compression
Dcompression
Ligne de transmission
Image reconstitue
Mmoriser
Demander
Mmoire
Figure III.1 Principe de la compression image
La compression peut tre sans perte, limage restera fidle limage originale, soit elle sera
avec perte de qualit (fidlit) pour rduire plus la taille de limage, dans ce cas-l, la
compression sera au prix de la dgradation autorise, ces types de compression sont faites
grce aux redondances des donnes prsentes sur limage. Ces redondances sont :
-Redondance psycho visuel : Des dtails non perceptible lil humain quon peut liminer
(cf. caractristiques de la vision humaine).
-Redondance inter pixel : La possible corrlation existante entre les pixels de limage, on dit
quune image a une redondance inter pixel si cest possible de prdire la valeur dun pixel
en connaissance de la valeur des pixels voisins (suivants ou prcdant), sachant que plus la
rsolution de limage est grande plus la probabilit de rencontr des redondance inter pixel
est leve.
-Redondance de codage : squences de rptition des bits, on rencontre cela gnralement
la fin de la compression, pendant ltape de codage.
III.1 Compression sans perte :
Appele aussi compression non destructrice, la qualit de limage aprs dcompression est
la mme que celle de limage originale, le taux de compression de ce type est limit.
Ce type de compression on le trouve beaucoup dans le domaine o la prcision est majeure
comme limagerie mdicale (IRM par ex.) ou la tldtection (imagerie satellite par ex.).Les
algorithmes de compression employs sont nombreux, les plus importants sont:
-Codage rptition : par ex. RLC (Run Length Coding)
-Codage entropique :
bas sur le codage longueur variable ou VLC (Variable Length Coding), par ex : le codage
de Huffman,le codage arithmtique,etc..
-Codage dictionnaire ou codage Lempel-Ziv-Welch (LZW) :
Ce codage ne ncessite plus de connaitre les probabilits des symboles comme dans le cas
du codage entropique.
III.2 Compression avec perte :
Cest une compression destructrice, elle permet de sacrifier certains dtails de limage non
rcuprable en dcompression au profit de rduction de poids. Cette dgradation peut tre
contrle selon la qualit quon veut obtenir en fonction du taux de compression choisie.
Image
originale
Canal de
transmission
Codage
Source
Codage
Canal
Dcodage
Canal
Dcodage
Source
Canal de
transmission
Image
reconstitue
Dcodeur
Figure III.2 Processus dun codec dimages fixes
Le codec (codeur/dcodeur) de source cest le block qui nous intresse, du fait que cest sur
ce bloc que la compression-codage /dcompression-dcodage aient lieu.La prsence du
codec canal a pour but contrairement au codage source dajouter des redondances au code
afin daugmenter lefficacit de la transmission en utilisant des codes dtecteurs et/ou
correcteurs derreurs (code de parit, code de Hammingetc).
Codage par
transformation
Quantificateur
Codage des
symboles
Vers Codage
Canal
IV.1.Dfinition :
La DCT ou Discret Cosine Transform, cest une transform linaire qui a t applique la
1re fois dans la publication des professeurs [N. Ahmed, T. Natarajan, and K. R. Rao,
"Discrete Cosine Transform", IEEE Trans. Computers, 90-93, Jan 1974].
Cest une variante de la transform de Fourier discrte, qui permet de garder seulement les
cosinus et dliminer les Sinus, cest--dire, obtenir une reprsentation frquentiel
purement rel. Cette transform est trs largement utilise dans la compression audio et la
compression image comme JPEG et MPEG.
IV.2.Variantes de la DCT :
Il existe 8 variante de la DCT, ceux les plus connus sont DCT I,la DCT 2D ou DCT II et sa
transform inverse IDCT ou DCT III, nous allons voir la dfinition de la DCT I,DCT II et DCT III
qui sont la base de la compression JPEG.
IV.2.1DCT I :
Pour une squence dlments discrets N, la DCT I sexprime par :
IV.2.2 DCT II :
Cest une extension directe de la DCT I dans deux dimensions 2D,NxN, qui seras notre
image, sa formule mathmatique est donne par :
On remarque si :
IV.2.3 IDCT:
Ou DCT III, elle est linverse de la DCT II, sa formule est donne par :
De
on peut sortir la proprit de symtrie qui va nous conduire une expression
simplifie du calcul de la DCT:
On remarque quon obtient la matrice image originale au final. Ces proprits rduisent
considrablement les calculs dans les algorithmes de compression dimage du fait que ces
lments seront dj calculs lavance (calcul de la matrice C).
Offset
Image originale
Canal de
transmission
Divisision de l'image
en sous-bloc 8x8
DCT 2D 8x8
(ou 16x16)
(ou 16x16)
Codage
entropique:
Huffman
Coffcients AC:
scan Zig-Zag +
codage RLC
Dcodage
entropique:
Huffman
Table de
quantification
Quantificateur
Cofficients
DC: Codage
prdctive
DPCM
Table de quantification
Coffcients AC:
dcodage RLC+
scan Zig Zag
inverse
Coffcients DC:
inverse DPCM
Quantificateur
inverse
Image
dcompresse
Fusion des
sous blocs 8x8
(ou16x16)
IDCT 8x8
(ou 16x16)
Offset
Codeur Source
Dcodeur Source
Figure V.1 Codec Source JPEG
[ ]
Cela a pour but dliminer les coefficients haute frquence dont lil humain est peu
sensible, seulement ceux prsent en dessous du seuil dfinis par la table de quantification
auront des amplitudes trs faibles (liminatoire), ces coefficients seront arrondis lentier
prt qui est souvent 0, dailleurs, si on prend par exemple la table de quantification de
luminosit normalise standard JPEG suivante calcul sur un facteur de qualit FQ = 5:
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
On remarque que les coefficients en hautes frquences seront diviss sur un nombre leve
(en rouge), et ceux en basses frquences seront diviser sur un nombre moins lev (noir).
2
0
0
0
0
RLC : -25
2
0
0
0
0
2
0
0
0
0
2
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
-1
0
0
0
5 2
-1
EOB
0
0
0
0
0
0
0
0
0
0
0
0
EOB (End Of Block) veut dire le reste des coefficients de la matrice sont zros, et @ suivis
du nombre de redondance de la valeur qui suit, par exemple : @ 5 0 veut dire que cest une
suite de cinq 0.
Enfin, les deux vecteurs DC et AC seront runis sur un mme vecteur pour le codage
entropique Huffman.
V.2.6 Codage Huffman
Ltape finale, cest le codage Huffman, qui va compresser le vecteur RLC la limite de la
compression sans perte (VLC).Le codage Huffman se droule en deux tapes :
1re tape : Construire larbre de Huffman en classant les probabilits de chaque symbole
de haut en bas, et on additionnant les probabilits faibles pour obtenir un autre symbole et
ainsi de suite jusqu il en reste que deux probabilits.
[0,1,1,1]
[0,0,0,0]
-3
[0,1,1,0]
[0,0,1,1]
-1
[0,0,0,1]
EOB [0,0,1,0]
[1,0]
[0,1,0]
[1,1]
En gnral cela est bas sur une table Huffman standard au JPEG dj prte, mais dans
notre cas, on va calculer nos tables de codage. Au final nous auront un vecteur de suite de 1
et 0 qui reprsente limage compresse JPEG.
Img_comp = [0
1 0] ;
V : I(mi,nj,2)
B : I(mi,nj,3)
Ce type peut tre dcompos en trois couches dimage de niveaux de gris o chaque
couche est traite comme une matrice distincte.
II.1.d Image indexe
Cest une image interprte par une matrice I * MxN+ qui contient lindices des pixels
de limage et une matrice K* Mx3+ qui contient la palette des couleurs de limage
(colormap).Chaque ligne de K donne le niveau dintensit du Rouge, du Vert, et du Bleu, de
chaque pixel pour reconstituer sa couleur unique. Ce type peut tre converti en RVB(RGB)
rel ou en niveau de gris (Grayscale) par les fonctions prtes de la boite outils image de
Matlab : ind2rgb et ind2gray
VI.2 Le code Matlab final :
Ce programme est modulaire, compos dun script dexcution principale : codec_jpeg.m et
des scripts suivants : init_jpeg.m init_indices_zigzag.m codage_jpeg.m decodage_jpeg.m .
codec_jpeg.m
% \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
% Programme basique sur la compression JPEG d'image fixe monochrome
% Version : 1.0
% Par: Azoug SeifEddine
% http://dynelectrons.net76.net
% dynelectrons@dynelectrons.net76.net
% Fait le: 01/01/2011
% \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
clear
% Chargement de la matrice image monochrome sur Matlab qui seras sous format entier
uint8
% et la convertir en double pour les calcul
img_originale = double(imread('zohrap.bmp'));
% Si Image a un espace de couleur RVB ou autre que monochrome,elle doit tre convertie
% img_originale = rgb2gray(img_originale);
dim_bloc = 8; %dimension 8x8 des sous blocs
init_jpeg;
% Dclaration et initialisation des variables ncssaires (voir:
init_jpeg.m)
init_jpeg.m
% Dclaration des variables et initialisation des constantes
jpeg = ones(size(img_originale)); % Matrice JPEG qui va contenir l'image compresse
jpeg_deco = ones(size(jpeg)); % Matrice qui va contenir l'image dcompress
offset = ones(dim_bloc,dim_bloc)*128; %Matrice 8x8 pour "Level Shifting".
DCT = dctmtx(dim_bloc); % Matrice C pour le calcul de F
% rcupration des dimensions de l'image.
[m,n] = size(img_originale);
dim_img = m*n;
%Matrice ou table de quantification Q (Standard JPEG)
quantizer =...
[...
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 ... ];
%Vecteur du scan Zigzag
zigzag = ones([1 dim_img]);
%Fonction de rcupration des indices du scan zigzag (voir init_indices_zigzag.m)
[col lig] = init_indices_zigzag(dim_bloc);
%Vecteur du codage/dcodage RLE et codage/dcodage Huffman
rle = [];
rle_deco = [];
huff_deco = [];
% Constantes utiles
taux_compression = 0;
taille_img_compresser = 0;
dec_l = 0;
dec_c = 0;
redondance = 0;
col_rle_p = 1;
k = 1;
z =1;
d=0;
init_indices_zigzag.m
%Cette fonction permet de crer deux matrices
%Une matrice ligne lig et une matrice colone "col"
%Chaque matrice va contenir respectivement indices ligne et colonnes
%Ces indices vont aid a faire le scan zig zag pour un sous bloc 8x8.
function [col,lig]=init_indices_zigzag(dim_bloc)
col = ones([1 (dim_bloc * dim_bloc)]);
lig = ones([1 (dim_bloc * dim_bloc)]);
lig(1) = 1;
k=2;
r=1;
for x=3:2:dim_bloc
for j=1:x
lig(k) = j;
k = k + 1;
end
for j=x-1:-1:1
lig(k) = j;
k = k + 1;
end
for j=1:x-1
col(r) = j;
r = r + 1;
end
for j=x-2:-1:1
col(r) = j;
r = r + 1;
end
if(x == 7 ),
x = x+1;
for j=1:x
lig(k) = j;
k = k + 1;
col(r) = j;
r = r + 1;
end
for j=x-1:-1:1
col(r) = j;
r = r + 1;
end
for z=2:2:x
for j=x:-1:z+1
lig(k) = j;
k = k + 1;
end
for j=z:x
lig(k) = j;
k = k + 1;
end
for j=z:x
col(r) = j;
r = r + 1;
end
if(z ~= dim_bloc)
for j=x:-1:z+1
col(r) = j;
r = r + 1;
end
end
end
end
end;
codage_jpeg.m
%Boucle gnral qui va parcourir l'image en sous bloc 8x8
for i=1:dim_bloc:m
dec_l = i-1; %Dcalage vertical des sous blocs
for j=1:dim_bloc:n
dec_c = j-1; %Dcalage vertical des sous blocs
jpeg(i:i+7,j:j+7) = img_originale(i:i+7,j:j+7) - offset; % Effectuer le "Level
Shifting".
jpeg(i:i+7,j:j+7) = DCT * jpeg(i:i+7,j:j+7) * DCT';
% Appliquer DCT
(cf.[7]).
Q.
jpeg(i:i+7,j:j+7) = round(jpeg(i:i+7,j:j+7));
le plus prs.
for q =1:64
zigzag(k) = jpeg(lig(q)+dec_l,col(q)+dec_c);
% Arrondir l'entier
% Effectuer un scan
ZigZag.
k = k + 1;
end
d = k - 64;
q = 1;
while(q <= 64) % Boucle While qui effectue un codage RLC sur chaque
sous bloc
if (d < dim_img) && (zigzag(d) ~= zigzag(d+1))
rle(z) = zigzag(d);
d = d + 1;
q = q + 1;
z = z + 1;
elseif (d < dim_img) && (zigzag(d) == zigzag(d+1)) &&
(zigzag(d+1) ~= zigzag(d+2))
rle(z) = zigzag(d);
rle(z+1) = zigzag(d+1);
d = d + 2;
q = q + 2;
z = z + 2;
elseif (d < dim_img) && (zigzag(d) == zigzag(d+1)) &&
(zigzag(d+1) == zigzag(d+2))&& (zigzag(d+2) ~= zigzag(d+3))
rle(z) = zigzag(d);
rle(z+1) = zigzag(d+1);
rle(z+2) = zigzag(d+2);
d = d + 3;
q = q + 3;
z = z + 3;
elseif (d < dim_img) && (zigzag(d) == zigzag(d+1)) &&
(zigzag(d+1) == zigzag(d+2))&& (zigzag(d+2) == zigzag(d+3))
redondance = 4;
rle(z) = 257;
rle(z+1) = redondance;
rle(z+2) = zigzag(d);
d = d + 3;
q = q + 4;
while (q <= 64) && (d < dim_img) && (zigzag(d) == zigzag(d+1))
redondance = redondance + 1;
q = q + 1;
d = d + 1;
end
rle(z+1) = redondance;
d = d + 1;
z = z + 3;
end
if(q == 64)
q = q+1;
end
end
% Dbut du codage Entropique de Huffman.
col_rle = z-1;
%Extraction des symboles uniques prsent dans le vecteur
%RLC.
symboles = unique(rle(col_rle_p:col_rle));
nbr_symboles = numel(symboles);
taille_block = numel(rle(col_rle_p:col_rle));
decodage_jpeg.m
%Dcodage Huffman
for i=1:dim_bloc:m
for j=1:dim_bloc:n
eval([ sprintf('huff_deco = [huff_deco huffmandeco(hcode_%d_%d,dico_%d_%d)];', i
,j,i ,j)]);
end
end
%Dcodage RLE
i = 1;
k = 1;
while(k <= numel(huff_deco))
if(huff_deco(k) == 257)
rle_deco(i:(i-1+huff_deco(k+1))) = huff_deco(k+2);
i = i + huff_deco(k+1);
k = k +3;
else
rle_deco(i) = huff_deco(k);
i = i +1;
k = k +1;
end
end
k=1;
for i=1:dim_bloc:m
dec_l = i-1;
for j=1:dim_bloc:n
dec_c = j-1;
%Scan zigzag inverse
for q =1:64
img_decompresse(lig(q)+dec_l,col(q)+dec_c) = rle_deco(k);
k = k + 1;
end
%quantification inverse + IDCT + Remises des niveaux (Inverse
%Level Shifting)
img_decompresse(i:i+7,j:j+7) = img_decompresse(i:i+7,j:j+7) .* quantizer;
img_decompresse(i:i+7,j:j+7) = DCT' * img_decompresse(i:i+7,j:j+7) * DCT;
img_decompresse(i:i+7,j:j+7) = img_decompresse(i:i+7,j:j+7) + offset;
end
end
VI.3 Rsultats :
Voici les rsultats pour cette image de niveau de gris 8bit 232x256 pixels de format
BMP (volumineux) et de taille 59392 bits :
taux_compression = 1.2516
taille_img_compresser = 47453bits
celle-ci. On remarque aussi que la DCT dans chaque sous blocs elle fait une concentration
des coefficients basses frquences (en blanc).
Limage na pas perdu de sa fidlit apparente, cela tant seulement visuellement
apparent, parce que lerreur quadratique moyenne nest pas nulle et gale EQM = 25.69
cela veut dire quil ya une erreur dune diffrence moyenne de 25.7 environs entre les
lments des deux matrices images mais elle nest notable seulement lchelle dun sous
bloc 8x8, o on peut remarquer cette diffrence sur la figure
FigureVI.2 Comparaison des sous bloc 8x8 de limage originale et limage compresse
Certains pixel ne sont pas les mmes dans les deux sous blocs et non pas le mme niveau
de gris, cela est due au fait que ltape de la quantification est une tape avec perte, o on
a arrondit a lentier pr aprs avoir divis sur la table Q.
Le rapport crte signal sur bruit 34 dB est acceptable ,ce qui montre quon a fait une
compression efficace en matire de taille/qualit. Le nombre de bit par pixel a t rduit
0.799 cela nous a fait perdre du poids au fichier image. Si on veut aller plus loin, on ajoute
la fonction suivante qui va gnrer dautres tables de quantification en fonction de FQ:
function quantizer = quantificateur (FQ,dim_bloc)
for i=1:dim_bloc
for j=1:dim_bloc
quantizer(i,j) = 1 + ((1 + i + j)*FQ);
end
end
Nous obtiendrons les rsultats suivants pour diffrents facteur qualit :
Pour : FQ = 10
taille_img_compresser =20820bits
taux_compression = 2.8526
EQM = 65.7042
PSNR = 29.9549 dB
bpp = 0.3506
Pour : FQ = 50
taille_img_compresser = 8978bits
taux_compression =
EQM =240.4954
6.6153
On remarque que plus on choisis un facteur de qualit grand, plus le taux de compression
est meilleur du fait quon augmente le seuil de la table Q mais EQM augmente aussi ce qui
va influer lefficacit de la compression constat visuellement et aussi au vue du rapport
PSNR mdiocre du fait quon a perdus beaucoup de donnes pendant ltape de
quantification et cela est devenue trs visible, ce qui rend limage exploitable certaines
limites.
VII. Conclusion
La compression JPEG pour quelle soit efficace doit tre effectue de faon optimale afin de
ne pas perdre trop en qualit de limage et en parallle rduire le poids de limage, cest-dire trouver un compromis rapport taille/qualit quest le standard JPEG.
La compression JPEG en mode codage DCT squentielle est une compression avec perte
non adapt aux besoins de prcision, mais serait le format le mieux adapt pour les
mmoires (grace aux JPEG que les appareils photo numrique ont fait leurs apparition) ou
pour le web (rapidit de transmission ),cela dit,un format nouveau a t dvelopper pour
les applications qui demande une fidlit maximum de limage trait limage rel,comme
limagerie mdicale, cest le format JPEG2000 qui a les mmes avantage du JPEG mais bas
sur une compression sans perte en utilisant une nouvelle transform appele la transform
en ondelettes.
VIII. Rfrences :
-Grard Blanchet et Maurice Charbit, Signaux et images sous Matlab ,Hermes
science publications,2001
-Aide du logiciel Mathworks Matlab R2010
-Syed Ali Khayam, The Discrete Cosine Transform (DCT): Theory and Application
http://www.egr.msu.edu/waves/people/Ali_files/DCT_TR802.pdf
-Pascal Getreuer,Image Processing with Matlab
http://www.math.ucla.edu/~getreuer/matlabimaging.html
-P-O stberg, Ume University,Compression
http://www8.cs.umu.se/kurser/TDBC30/VT05/material/lecture8.pdf
-JPEG Image Compression,Rahul Garg, Varun Gulshan
http://www.cs.washington.edu/homes/rahul/data/JPEG.pdf
-VIDEO & IMAGE COMPRESSION TECHNIQUES
http://videocodecs.blogspot.com/2007/05/image-coding-fundamentals_08.html
-Wikipedia
http://fr.wikipedia.org/wiki/JPEG
-Institut des Systmes Intelligents et de Robotique
http://www.isir.upmc.fr/UserFiles/File/clady_homepage/EPU/matlab_ti.pdf
-Girod: Image and Video Compression
http://www.icg.isy.liu.se/courses/tsbk01/material/slides/TransformCoding_ee392c_Girod.pdf
-Compression dimage,E. LE PENNEC
http://www.math.jussieu.fr/~lepennec/papers/Image2006LePennec.pdf