1、 图像处理图像处理课程设计报告课程设计报告 设计题目:熵编码研究 专业班级: 学生姓名: 熵编码研究 摘要摘要 哈夫曼是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。 Huffman 于 1952 年提出一种编码方法,该方法完全依据字符出现概率来构造异 字头的平均长 度最短的码字, 有时称之为最佳编码, 一般就叫作 Huffman编码。 以哈夫曼树即最优二叉树, 带权路径长度最小的二叉树, 经常应用于数据压缩。 在计算机信息处理中, “哈夫曼编码”是一种一致性编码法(又称“熵编码法“) , 用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符(例如某 文件中的一个符号)进行
2、编码。这张编码表的特殊之处在于,它是根据每一个源 字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出 现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低, 从而达到无损压缩数据的目的) 。 这种方法是由David.A.Huffman发展起来的。 例 如,在英文中,e 的出现概率很高,而 z的出现概率则最低。当利用哈夫曼编码 对一篇英文进行压缩时,e 极有可能用一个位(bit)来表示,而 z则可能花去 25 个 位(不是 26) 。用普通的表示方法时,每个英文字母均占用一个字节(byte) ,即 8 个位。二者相比,e 使用了一般编码的 1/8 的长度,z则
3、使用了 3 倍多。倘若我 们能实现对于英文中各个字母出现概率的较准确的估算, 就可以大幅度提高无损 压缩的比例。 和其它熵编码方法不同的地方在于, 其他的熵编码方法通常是把输入的消息 分割为符号,然后对每个符号进行编码,而算术编码是直接把整个输入的消息编 码为一个数,一个满足(0.0 n 0 string = string uint8(zeros(1,pad); end codeword = codeword(symbols); codelen = zeros(size(codeword); weights = 2.(0:23); maxcodelen = 0; for index = 1:l
4、ength(codeword) len = length(codewordindex); if lenmaxcodelen maxcodelen = len; end if len0 code = sum(weights(codewordindex =1); code = bitset(code,len+1); codewordindex = code; codelen(index) = len; end end codeword = codeword:; %计算压缩后的向量 cols = length(string)/8; %将字符串的长度除以 8,得到列数 string = reshape
5、(string,8,cols); %对这个字符串阶数重组,8 行,cols 列 weights = 2.(0:7); zipped = uint8(weights*double(string); huffcodes = sparse(1,1); %码表存储到一个稀疏矩阵 for index = 1:nnz(codeword) %length(codeword),numel(codeword) huffcodes(codeword(index),1) = symbols(index); end %填写解码时所需的结构信息 info.pad = pad; %添加的比特数 info.huffcode
6、s = huffcodes; %产生 Huffman码字 info.ration = cols./length(vector); %显示原始图像的列数除以矩阵长度的值 info.length = length(vector); %显示原始图像数据长度 info.maxcodelen = maxcodelen; %显示最大码长 info.rows = m; %显示原始图像的行数 info.cols = n; %显示原始图像的列数 function vector = huffdecode(zipped,info,image) %huffdecode 函数对输入矩阵 vector 进行 Huffman 解码,返回解压后 的图像数据 ifisa(zipped,uint8) error(input argument must