欢迎来到天天文库
浏览记录
ID:18138010
大小:168.50 KB
页数:7页
时间:2018-09-14
《图像程序-霍夫曼编码》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、赫夫曼编码设计原理赫夫曼(Huffman)编码是1952年提出的,是一种比较经典的信息无损熵编码,该编码依据变长最佳编码定理,应用Huffman算法而产生。Huffman编码是一种基于统计的无损编码。设信源X的信源空间为:其中,,现用二进制对信源X中的每一个符号(i=1,2,…N)进行编码。根据变长最佳编码定理,Huffman编码步骤如下:(1)将信源符号xi按其出现的概率,由大到小顺序排列。(2)将两个最小的概率的信源符号进行组合相加,并重复这一步骤,始终将较大的概率分支放在上部,直到只剩下一个信源符号且概率达到1.0为止;(3)对每对组合的上边一个指定为1,下边一个指定为
2、0(或相反:对上边一个指定为0,下边一个指定为1);(4)画出由每个信源符号到概率1.0处的路径,记下沿路径的1和0;(5)对于每个信源符号都写出1、0序列,则从右到左就得到非等长的Huffman码。Huffman编码的特点是:(1)Huffman编码构造程序是明确的,但编出的码不是唯一的,其原因之一是两个概率分配码字“0”和“1”是任意选择的(大概率为“0”,小概率为“1”,或者反之)。第二原因是在排序过程中两个概率相等,谁前谁后也是随机的。这样编出的码字就不是唯一的。(2)Huffman编码结果,码字不等长,平均码字最短,效率最高,但码字长短不一,实时硬件实现很复杂(特别
3、是译码),而且在抗误码能力方面也比较差。(3)Huffman编码的信源概率是2的负幂时,效率达100%,但是对等概率分布的信源,产生定长码,效率最低,因此编码效率与信源符号概率分布相关,故Huffman编码依赖于信源统计特性,编码前必须有信源这方面的先验知识,这往往限制了哈夫曼编码的应用。(4)Huffman编码只能用近似的整数位来表示单个符号,而不是理想的小数,这也是Huffman编码无法达到最理想的压缩效果的原因。设计程序clearloadwoman;%读入图像数据%X=imread('girl.bmp','bmp');data=uint8(X);[zipped,info
4、]=huffencode(data);%调用Huffman编码程序进行压缩unzipped=huffdecode(zipped,info,data);%调用Huffman编码程序进行解码%显示原始图像和经编码后的图像,显示压缩比,并计算均方根误差得erms=0,表示是Huffman是无失真编码subplot(121);imshow(data);subplot(122);imshow(unzipped);%erms=compare(data(:),unzipped(:))cr=info.ratiowhosdataunzippedzipped%huffencode函数对输入矩阵v
5、ector进行Huffman编码,返回%编码后的向量(压缩后数据)及相关信息function[zipped,info]=huffencode(vector)%输入和输出都是unit8格式%info返回解码需要的机构信息%info.pad是添加的比特数%info.huffcodes是Huffman码字%info.rows是原始图像行数%info.cols是原始图像行数%info.length是原始图像数据长度%info.maxcodelen是最长码长if~isa(vector,'uint8')error('inputargumentmustbeauint8vector');en
6、d[m,n]=size(vector);vector=vector(:)';f=frequency(vector);%计算各符号出现的概率(调用frequency)symbols=find(f~=0);f=f(symbols);[f,sortindex]=sort(f);%将符号按照出现的概率大小排序symbols=symbols(sortindex);len=length(symbols);symbols_index=num2cell(1:len);codeword_tmp=cell(len,1);whilelength(f)>1%生产Huffman树,得到码字编码表ind
7、ex1=symbols_index{1};index2=symbols_index{2};codeword_tmp(index1)=addnode(codeword_tmp(index1),uint8(0));codeword_tmp(index2)=addnode(codeword_tmp(index2),uint8(1));f=[sum(f(1:2))f(3:end)];symbols_index=[{[index1,index2]}symbols_index(3:end)];[f,sortinde
此文档下载收益归作者所有