Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
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.
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).
Pour les tests, on écrira un programme principal qui utilise cette fonction, et on prendra une
matrice de quantification standard donnée par :
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]
Traitement d’images médicales TP_Matlab
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.
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).
Le schéma complet d’une chaine de codage –décodage JPEG peut être représenté comme suit :
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)).
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
Traitement d’images médicales TP_Matlab
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);