0% ont trouvé ce document utile (0 vote)
6 vues10 pages

Calcul et Codage de l'Entropie et Huffman

Transféré par

nimos9810
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
6 vues10 pages

Calcul et Codage de l'Entropie et Huffman

Transféré par

nimos9810
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd

TP N° 01

A)Calcul de l'entropie, calcul des probabilités et des fréquences:

 Voici la fonction entrop :

function H = entrop(X)

X = X(:);% Transformer l'image X en un vecteur Colonne

[P, Frequence, Alph] = proba(X); % Calculer les probabilités et fréquences


avec la fonction proba

H = -sum(P.*log2(P)); % Calculer l'entropie

end

 Voici la fonction proba :

function [p,Frequence,Alph]=proba(X)
Alph=unique(X);
Frequence=zeros(size(Alph));
for i=1:length(Alph)
Frequence(i)=sum(X==Alph(i));
end
p=Frequence/length(X);
end

C/ L'entropie de la source :

function [H]=entropie(p)
p=[0.2 0.4 0.2 0.1 0.1]
For i=1:length (p)
H(i)=-sum(p.*log2(p));

2/lmoy de code huff:


clc;
Clear all;
Close all;
Symboles=[1 2 3 4 5]
[dict,avgalen]=huffmandict

3/l'eff d'un code:


clc;
clear all;
close all;
symbol=[1 2 3 4 5];
p=[0.2 0.4 0.2 0.1 0.1];
[dict,avglen]=huffmandict(symbol,p,2)
[L]=average_cod(dict,p)h
H

D/ codage huffman de sig :


1.
clc;
clear all;
close all;
sig=([3 3 1 3 3 3 3 3 2 3],1,50);
symbol=[1 2 3];
p=[0.1 0.1 0.8];
[dict,Lh]=huffmandict(symbol,p);
X1=dict(1,2)
X2=dict(2,2)
x3=dict(3,2)
hcode=huffmanenco(sig,dict);

2. l'eff de code:

clc;
clear all;
close all;
sig=([3 3 1 3 3 3 3 3 2 3],1,50);
symbol=[1 2 3];
p=[0.1 0.1 0.8];
[dict,Avglen]=huffmandict(symbol,p)
X1=dict(1,2)
X2=dict(2,2)
X3=dict(3,2)
hcode=huffmanenco(sig,dict);
Lh=numel(hcode)/numel(sig)
h=-sum(p*log2(p))
eff=h/Lh

2. la comparaison:

clc;
clear all;
close all;
sig=([3 3 1 3 3 3 3 3 2 3],1,50);
[p,freq,sym]alph=proba(sig)
%symbol=[1 2 3];
%p=[0.1 0.1 0.8];
[dict,Lh]=huffmandict(sym,p);
hcode=huffmanenco(sig,dict);
dhcode=huffmandeco(hcode,dict);
test1=all(all(sig==dhcode))
test2=isequal(sig,dhcode)
X1=dict(1,2)
X2=dict(2,2)
X3=dict(3,2)
fprintf('la taille de signal original est %d bits\n',numel(dec2bin(sig,8)))
fprintf('la taille de signal comprese est %d bits\n',numel(hcode))
Lh1=numel(hcode)/numel(sig)
h1=-sum(p*log2(p))
eff1=h1/Lh1
Tc1=numel(dec2bin(sig,8))/numel(hcode)
fprintf('Lh1=%f bits /symb,h1=%f bits /symb,eff1=%f,Tc1=%f,codage de huffman pour
1000 symboles\n',Lh1,h1,eff1,Tc1)

4/ refaire la qst:

clc;
clear all;
close all;
sig=([3 3 1 3 3 3 3 3 2 3],1,50);
alph=unique(sig)
[p,freq,sym]=proba(sig)

5. l'entopie de l'image:

clc;
clear all;
close all;
i=imread('[Link]');
i=i(1:64,1:64);
sig=i(:);
[L,C]=size(i);
[p,freq,symbols]=proba(sig);
[dict,Lh]=huffmandict(sym,p);
hcode=huffmanenco(sig,dict);
dhcode=huffmandeco(hcode,dict);
s=reshape(sig,[L,C]);
test1=all(all(sig==dhcode))
test2=isequal(sig,dhcode)
H1=entropy(image) %entropy

f/
function [unique]=unique_decod1(x)
x1=[0];
x2=[0 1];
x3=[1 0];
x4=[1 1 1];
x=[x1 x2 x3 x4]
y1=numel(x1); y2=numel(x2); y3=length(x3); y4=length(x4);
m=1/2^(x1)+1/2^(x2)+1/2^(x3)+1/2^(x4);
if x1=x2|x2=x3|x3=x1|x4=x1|
'pas unique'
eLse 'unique'
if x1(x)=x2(x) & x2(x)=x3(x) & x3(x)=x1(x) & x2(x)=x4(x) & x4(x)=x1(x)
'pas unique et a prefixe'
else
'unique'
m=1/2^(x1)+1/2^(x2)+1/2^(x3)+1/2^(x4)
if m<=1
'unique'
end
end
end
end
TP N° 02

1/ Codage arithmetique :
clc;
clear all;
close all;
sig=([3 3 1 3 3 3 3 3 2 3], 1,50);
[p,freq,Alph]=proba(sig)
hcode=arithenco(sig,freq);
dhcode=arithmandeco(hcode,freq,length(sig));
test1=all(all(sig==dhcode))
test2=isequal(sig,dhcode)
Lh1=numel(hcode)/length(sig);
h1=-sum(p.*log2(p))
eff1=h1/Lh1;
Tc1=numel(dec2bin(sig,8))/numel(hcode)
fprintf('la taille de la séquence original est %d bits\n',numel(dec2bin(sig,8)))
fprintf('la taille de la séquence decompresse est %d bits\n',numel(hcode))
fprintf('Lh1=%f bits /symb,h1=%f bits /symb,eff1=%f,Tc1=%f,codage arithmétique
pour 500 symboles\n',Lh1,h1,eff1,Tc)

4/ le programme :
clc;
clear all;
close all;
sig=repmat([3 3 1 3 3 3 3 3 2 3],1,50);
sig2=repmat([3 3 1 3 3 3 3 3 2 3],1,1000);

[p,freq,Alph]=proba(sig)
[dict,Lh]=huffmandict(Alph,p);
hcode=huffmanenco(sig,dict);
dhcode=huffmandeco(hcode,dict);
test1=all(all(sig==dhcode))
Lh=numel(hcode)/length(sig);
h=-sum(p.*log2(p))
eff=h/Lh;
Tc=numel(dec2bin(sig,8))/numel(hcode)

[p,freq2,Alph2]=proba(sig2)
[dict,Lh]=huffmandict(Alph2,p);
hcode1=huffmanenco(sig2,dict);
dhcode1=huffmandeco(hcode1,dict);
test2=all(all(sig==dhcode))
Lh1=numel(hcode)/length(sig);
h1=-sum(p.*log2(p))
eff1=h1/Lh1;
Tc1=numel(dec2bin(sig2,8))/numel(hcode1);
fprintf('la taille de la séquence avant le codage est %d bits pour 500 symboles \
n',numel(dec2bin(sig,8)))
fprintf('la taille de la séquence aprés le codage est %d bits\n',numel(hcode))
fprintf('Lh=%f bits /symb,h=%f bits /symb,eff=%f,Tc=%f,codage huffman pour 500
symboles\n',Lh,h,eff,Tc)

fprintf('la taille de la séquence avant le codage est %d bits pour 10000


symboles \n',numel(dec2bin(sig2,8)))
fprintf('la taille de la séquence aprés le codage est %d bits\n',numel(hcode1))
fprintf('Lh1=%f bits /symb,h1=%f bits /symb,eff1=%f,Tc1=%f,codage huffman pour
10000 symboles\n',Lh1,h1,eff1,Tc1)

hcode20=arithenco(sig,freq);
dhcode20=arithdeco(hcode20,freq,length(sig));
test20=all(all(sig==dhcode20))
test21=isequal(sig,dhcode20)
Lh20=numel(hcode20)/length(sig);
h20=-sum(p.*log2(p))
eff20=h20/Lh20;
Tc1=numel(dec2bin(sig,8))/numel(hcode20)

hcode2=arithenco(sig,freq);
dhcode2=arithdeco(hcode2,freq,length(sig));
test22=all(all(sig==dhcode2))
test23=isequal(sig,dhcode2)
Lh2=numel(hcode2)/length(sig);
h2=-sum(p.*log2(p))
eff2=h2/Lh2;
Tc2=numel(dec2bin(sig,8))/numel(hcode2)

hcode23=arithenco(sig2,freq);
dhcode23=arithdeco(hcode23,freq,length(sig2));
test23=all(all(sig2==dhcode23))
test23=isequal(sig2,dhcode23)
Lh23=numel(hcode23)/length(sig2);
h23=-sum(p.*log2(p))
eff23=h23/Lh23;
Tc23=numel(dec2bin(sig2,8))/numel(hcode23)

fprintf('la taille de la séquence avant le codage est %d bits\


n',numel(dec2bin(sig,8)))
fprintf('la taille de la séquence decompresse est %d bits\n',numel(hcode2))
fprintf('Lh2=%f bits /symb,h2=%f bits /symb,eff2=%f,Tc2=%f,codage arithmétique
pour 500 symboles\n',Lh2,h2,eff2,Tc2)

fprintf('la taille de la séquence avant le codage est %d bits\


n',numel(dec2bin(sig2,8)))
fprintf('la taille de la séquence decompresse est %d bits\n',numel(hcode23))
fprintf('Lh23=%f bits /symb,h23=%f bits /symb,eff23=%f,Tc23=%f,codage arithmétique
pour 10000 symboles\n',Lh23,h23,eff23,Tc23)

 L’affichage

%la taille de la séquence avant le codage est 4000 bits pour 500 symboles
la taille de la séquence aprés le codage est 600 bits
Lh=1.200000 bits /symb,h=0.921928 bits /symb,eff=0.768273,Tc=6.666667,codage
huffman pour 500 symboles
la taille de la séquence avant le codage est 80000 bits pour 10000 symboles
la taille de la séquence aprés le codage est 12000 bits
Lh1=1.200000 bits /symb,h1=0.921928 bits /symb,eff1=0.768273,Tc1=6.666667,
codage huffman pour 10000 symboles

la taille de la séquence avant le codage est 4000 bits


la taille de la séquence decompresse est 471 bits
Lh2=0.942000 bits /symb,h2=0.921928 bits /symb,eff2=0.978692,Tc2=8.492569,codage
arithmétique pour 500 symboles
la taille de la séquence avant le codage est 80000 bits
la taille de la séquence decompresse est 9232 bits
Lh23=0.923200 bits /symb,h23=0.921928 bits
/symb,eff23=0.998622,Tc23=8.665511,codage arithmétique pour 10000 symboles

E/
clc;
close all;
clear all;
x=imread('[Link]');
h=x(:);
[l,c]=size(x);
[p,freq,alph]=proba(h)
m=reshape (x,[c,l]);
test=all(all(x==m))
hcode=arithenco(h,freq);
dhcode=arithdeco(hcode,freq,length(h));
lh1=length(hcode)/length(h)
h1=-sum(p.*log2(p));
eff1=h1/lh1;
s=reshape(y,[c,l]);
test1=all(all(s==x));
fprintf('la taille de h la séquence original codage de huffman est %d bits\
n',numel(dec2bin(h,8)))
fprintf('la taille de h la séquence compresse pour le codage de huffman est %d
bits\n',numel(hcode))
fprintf('la taille de h la séquence decompresse pour le codage de huffman est %d
bits\n',numel(dhcode))

22/codage RLE :
clc;close all; clear all;
%data=RLE(x)(de)comporessses the data with the rle algorithme
%compresion
%decompresion
if iscell(x)%decoder
i=cumsum([1 *{2}]);
j=zeros(1,i(end)-1);
j(i(1:end-1))=1;
data=x{1}(cumsum(j));
else %coder
if size(x,1)>size(x,2),x=x';end
i= (find(x(1:end-1)=x(2:end))length(x)];
data{2}=diff([0 i]);
data{1}=x(i);
end
end
TP N° 03

1/ Quantification scalaire uniforme, compression d’image avec perte,


et evaluation de la qualité des images décompressées
clc;
clear all;
close all;
m=imread('[Link]');
o=double(m);
figure(1)
imshow(m);
title('image quantifée à 8 bit');
[freq,val]=imhist(uint8(o),256);
figure(2)
plot(val,freq,'k','linewidth',2);
title('histogramme de l''image');
xlabel('valeur de pixel');
ylabel('frequence');
Iq = zeros(size(o));
%% QNTFCT
% B = 1;
b=2;
segma=std2(o);
SNR=zeros(b,1);
for B=1:b
z=2^B;
delta = (255-0)/z;
d=linspace(0,255,z+1);
r=zeros(z,1);

for j=1:z
r(j) =d(j)+(delta/2);
end;
for j=1:z
[x,y]=find(s>d(j) & s<=d(z+1));
for i = 1:length(x)
Iq(x(i),y(i))=round(r(j)); %f1
end; end
if B == 1 || B==2 || B==3 % || B == 4 || B==5 || B==6
figure(13);
imshow(uint8(Iq));
title(['IMAGE QUANTIFE A ' , num2str(B) ' BIT'])
SNR(B)=(20*log10(segma/std2(s-Iq)));
end
SNR
%codage huffman
rth=Iq(:);
[c,l]=size(Iq);
[p,Frequence,Alph]=proba(rth);
[dict,Lh2]=huffmandict(Alph,p)
tic
hcode =huffmanenco (rth,dict);
tcodhuff=toc
tic
dec=huffmandeco(hcode ,dict);
tdecodhuff=toc
%calcule de psnr
[M,N]=size(G)
mse=(1/(M*N))*sum(sum((double(G))-( double(reshape(dec,[c,l])))).^2)
Psnr=10*log10(255^2/mse)

1/
De 1 bit :

De 2 bit :

De 3 bit :
De 1 bit :
SNR = 5.4236
dict =
[ 64] [1]
[191] [0]
Lh2 = 1
tauxcodage = 0.6220
mse =1.3133e+005
3/ Psnr =-3.0530
De 2 bit :

SNR =
0
11.1412
dict =
[ 32] [1x2 double]
[ 96] [1x3 double]
[159] [0]
[223] [1x3 double]
Lh2 =1.5992
tauxcodage =1.1843
mse = 4.2848e+003
3/ Psnr =11.8115
De 3 bit :
SNR =
0
0
17.2904
dict =
[ 16] [1x2 double]
[ 48] [1x4 double]
[ 80] [1x5 double]
[112] [1x3 double]
[143] [1x2 double]
[175] [1x2 double]
[207] [1x6 double]
[239] [1x6 double]
Lh2 = 2.3715
tauxcodage =1.4037
mse =1.9112e+003
3/ Psnr =15.3177

Vous aimerez peut-être aussi