1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| img_originale=rgb2gray(double(imread('lena.jpg')));
jpeg=ones(size(img_originale));
dim_bloc=8;%matrice jpeg qui va contenir l'image compressé
jpeg_deco=ones(size(jpeg));%matrice qui va contenir l'image decomprésse
offset=ones(dim_bloc,dim_bloc)*128;%matrice 8x8 pour level shifting
DCT=dctmtx(dim_bloc);%matrice C pour le calcul de F
%récupération des dimensions de l'image
a=size(img_originale);
m=a(1);
n=a(2);
dim_img=m*n;
zigzag=ones([1 dim_img]);
[col lig]=init_indices_zigzag(dim_bloc);
rle= [];
rle_deco= [];
huff_deco= [];
hcode=[];
%constantes initiales
taux_compression=0;
taille_img_compresser=0;
dec_l=0;
dec_c=0;
redaondance=0;
col_rle_p=1;
k=1;
z=1;
d=0;
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];
for i=1:dim_bloc:m
dec_l=i-1;
for j=1:dim_bloc:n
dec_c=j-1;
jpeg(i:i+7,j:j+7)=img_originale(i:i+7,j:j+7)-offset;
jpeg(i:i+7,j:j+7)=DCT*jpeg(i:i+7,j:j+7)*DCT';
jpeg(i:i+7,j:j+7)=jpeg(i:i+7,j:j+7)./quantizer;
jpeg(i:i+7,j:j+7)=round(jpeg(i:i+7,j:j+7));
for q=1:64
zigzag(k)=jpeg(lig(q)+dec_l,col(q)+dec_c);
k=k+1;
end
d=k-64;
q=1;
while(q<=64)
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);
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
col_rle=z-1;
symboles=unique(rle(col_rle_p:col_rle));
nbr_symboles=numel(symboles);
taille_block=numel(rle(col_rle_p:col_rle));
%calcul des probabilités de chaque symboles
table_p=ones(1,nbr_symboles);
for q=1:nbr_symboles;
itter=0;
for r=col_rle_p:col_rle
if (rle(r)==symboles(q))
itter=itter+1;
end
end
table_p(q)=itter/taille_block;
end
%dressage de l'arbre de huffman et codage de chaque
%symbole de chque sous bloc.
eval([sprintf('dico_&d_&d=huffmandict(symboles,table_p);',i,j)]);
eval([sprintf('hcode_&d_&d=huffmanenco(rle(col_rle_p:col_rle),dico_&d_&d);',i,j,i,j)]);
col_rle_p=col_rle+1;
end
end |
Partager