香农编码费诺编码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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