香农编码费诺编码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验目的:通过该实验,掌握通过计算机实验可变长信源编码方法,进一步熟悉香农编码,费诺编码以及霍夫曼编码方法。

实验环境: Matlab7.1

实验内容及过程:

1.对于给定的信源的概率分布,用MA TLAB语言实现香农编码。

2. 对于给定的信源的概率分布,用MA TLAB语言实现霍夫曼编码。

3. 对于给定的信源的概率分布,用MATLAB语言实现游程编码。

以下为M文件:

1.

function c = shannon(p)

% p = [0.2 0.15 0.15 0.1 0.1 0.1 0.1 0.1] % shannon(p)

[p , index] = sort(p) ;

p = fliplr(p) ;

n = length(p) ;

pa = 0 ;

for i = 2:n

pa(i) = pa(i - 1) + p(i - 1) ;

end

k = ceil(-log2(p)) ;

c = cell(1,n) ;

for i = 1:n

c{i} = '' ;

tmp = pa(i) ;

for j = 1:k(i)

tmp = tmp * 2 ;

if tmp >= 1

tmp = tmp - 1 ;

c{i}(j) = '1' ;

else

c{i}(j) = '0' ;

end

end

end

c = fliplr(c) ; c(index) = c ;

2.

function c = huffman(p)

n = size(p , 2) ;

if n == 1

c = cell(1,1) ;

c{1} = '' ;

return

end

[p1 , i1] = min(p) ;

index = [(1:i1-1) , (i1+1:n)] ; p = p(index) ;

n = n - 1 ;

[p2 , i2] = min(p) ;

index2 = [(1:i2-1) , (i2+1:n)] ; p = p(index2);

i2 = index(i2) ;

index = index(index2) ;

p(n) = p1 + p2 ;

c = huffman(p) ;

c{n+1} = strcat(c{n} , '1') ;

c{n} = strcat(c{n} , '0') ; index = [index , i1 , i2] ;

c(index) = c ;

3.

% 以下程序是将原图像转换为二值图像

image2=image1(:); %将原始图像写成一维的数据并设为image2 image2length=length(image2); % 计算image2的长度

for i=1:1:image2length % for 循环,目的在于转换为二值图像if image2(i)>=127

image2(i)=255;

else image2(i)=0;

end

end

image3=reshape(image2,146,122); % 重建二维数组图像

,并设为image3

figure,imshow(image3);%(右图)

% 以下程序为对原图像进行游程编码,压缩

X=image3(:); %令X为新建的二值图像的一维数据组

x=1:1:length(X); % 显示游程编码之前的图像数据

figure,plot(x,X(x));

j=1;

image4(1)=1;

for z=1:1:(length(X)-1) % 游程编码程序段

if X(z)==X(z+1)

image4(j)=image4(j)+1;

else

data(j)=X(z); % data(j)代表相应的像素数据

j=j+1;

image4(j)=1;

end

image4length=length(image4); % 计算游程编码后的所占字节数,记为image4length y=1:1:image4length ; % 显示编码后数据信息

figure,plot(y,image4(y));

CR=image2length/image4length; % 比较压缩前于压缩后的大小

% 下面程序是游程编码解压

l=1;

for m=1:image4length

for n=1:1:image4(m);

rec_image(l)=data(m);

l=l+1;

end

end

u=1:1:length(rec_image); % 查看解压后的图像数据

figure,plot(u,rec_image(u));

rec2_image=reshape(rec_image,146,122); % 重建二维二维图像数组figure,imshow(rec2_image); % 显示解压恢复后的图像

通过matlab可以看出,程序运行过程中

各个变量的值:%右图

CR=12.084,说明该游程编码,

压缩率为12.084

相关文档
最新文档