图像的霍夫曼编码Word格式.docx
- 文档编号:22708601
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:11
- 大小:123.47KB
图像的霍夫曼编码Word格式.docx
《图像的霍夫曼编码Word格式.docx》由会员分享,可在线阅读,更多相关《图像的霍夫曼编码Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
1952年,David
A.
Huffman在麻省理工攻读博士时,根据香农(Shannon)在1948年和范若(Fano)在1949年阐述的编码思想提出了一种不定长编码的方法——霍夫曼编码,并发表于《一种构建极小多余编码的方法》一文。
霍夫曼编码是常用的无损编码方法,广泛应用于图像压缩技术。
JPEG标准中的基准模式采用的就是霍夫曼编码。
霍夫曼编码是不定长编码,即代表各元素的码字长度不等。
该编码是基于不同符号的概率分布,在信息源中出现概率越大的符号,相应的码越短;
它在变长编码中是最佳的。
在计算机信息处理中,“霍夫曼编码”是一种一致性编码法(又称"
熵编码法"
)
霍夫曼编码的基本方法是先对图像数据扫描一遍,计算出各种像素出现的概率,按概率的大小指定不同长度的唯一码字,由此得到一张该图像的霍夫曼码表。
编码后的图像数据记录的是每个像素的码字,而码字与实际像素值的对应关系记录在码表中。
三、霍夫曼编码
1、霍夫曼编码规则
设信源X的信源空间为:
其中,
,现用二进制对信源
中的每一个符号
进行编码
a.将信源符号xi按其出现的概率,由大到小顺序排列。
b.将两个最小的概率的信源符号进行组合相加,并重复这一步骤,始终将较大的概率分支放在上部,直到只剩下一个信源符号且概率达到1.0为止;
c.对每对组合的上边一个指定为1,下边一个指定为0(或相反:
对上边一个指定为0,下边一个指定为1);
d.画出由每个信源符号到概率1处的路径,记下沿路径的1和0,所得的就是该符号的霍夫曼码字。
2、霍夫曼树
(1)霍夫曼树的相关概念
霍夫曼树:
指所有叶子结点的二叉树中带权路径长度最小的二叉树。
节点的带权路径长度:
从树的根节点到该节点的路径长度与该节点权的乘积。
树的带权路径长度:
树中所有叶子结点的带权路径长度之和。
(2)霍夫曼算法
a.根据给定的n个权值{w1,w2,...,wn}构造n棵二叉树的集合F={T1,T2,...,Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均空。
b.在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
c.在F中删除这两棵树,同时将新得到的二叉树加入F中。
d.重复
(2)和(3),直到F中只含一棵树为止。
这棵树便是最优二叉树。
(3)霍夫曼树的构建
假设对由a1、a2、a3、a4、a5、a6、a7、a8八个信源符号组成的源信息字符串:
“a1a1a2a2a3a3a3a4a4a4a4a5a5a5a6a6a6a7a7a8”进行霍夫曼编码。
首先应对信息中各数字出现的次数进行统计,得出各数字出现的相对概率。
假设各数字出现的次数及概率如表1所示。
表一
码值
a1
a2
a3
a4
a5
a6
a7
a8
次数
2
3
4
1
概率
0.1
0.15
0.2
0.05
具体过程是这样的,先将所有符号排成一行构成8个最底层节点。
首先将这些节点中最小两个概率值相加:
0.05+0.1=0.15,得到新的节点,这时拥有的概率值为0.2,0.1,0.1,0.15,0.15,0.15,0.15。
再将两个最小的概率值相加得到新的节点......直到得到根节点概率为1.0为止。
相加时,对于概率值相等的多个节点,可以任意选取。
除根节点外,设节点左边分支为0,右边分支为1(也可以反过来)。
根据表一生成的霍夫曼树如图1所示。
图1
对于各值(码值)的代码(码字)就是从根节点出发到底层节点所经历的分支序列。
如a4的代码(码字)为00,a6的码字为111......通常a4和a6等称为码值,00和111等称为码字。
所有码值和码字对应关系如表2所示。
3.霍夫曼的局限性
a.利用霍夫曼编码,每个符号的编码长度只能为整数,所以如果源符号集的概率分布不是2负n次方的形式,则无法达到熵极限。
b.输入符号数受限于可实现的码表尺寸
c.译码复杂
d.需要实现知道输入符号集的概率分布
e.没有错误保护功能
四、霍夫曼编码分类
1、截断霍夫曼编码
霍夫曼编码不仅适用于压缩文本文件,经过符号合并后也可用于二进制文件。
但在实用中,霍夫曼编码的输入符号数常受限于可实现的码表大小。
JEPEG采用将码字截断为“前缀码(SSSS)+尾码”的方法,对码表进行了简化,这种编码方法称为截断霍夫曼编码。
前缀码用来指明尾码的有效位数(设为B位),用标准的霍夫曼编码;
尾码则直接采用B位自然二进码(对于给定的前缀码它为定长码,高位在前)。
对于8位量化的图像,SSSS值的范围为0~11,故其码表只有12项。
根据DIFF的幅度范围由表4.2查出前缀码字和尾码的位数后,则可按以下规则直接写出尾码的码字,即
按此规则,当DIFF0时,尾码的最高位是“1”;
而当DIFF0时则为“0”。
解码时则可借此来判断DIFF的正负。
2、自适应霍夫曼编码
(1)自适应霍夫曼编码提出的目的和意义
在静态霍夫曼编码中,要构造编码树必须提前统计被编码对象中的符号出现概率,因此必须对输入符号流进行两遍扫描,第一遍统计符号出现概率并构造编码树,第二遍进行编码,这在很多实际应用的场合中之不能接受的。
其次,在存储和传送霍夫曼编码时,必须先存储和传送霍夫曼编码树。
再次,静态编码树构造方案不能对输入符号流的局部统计规律变化做出反应。
这些问题使得静态霍夫曼编码在实际中并未得到广泛的应用。
为了解决静态Huffman编码的缺点,人们提出了自适应Huffman编码这种方案不需要事先扫描输入符号流,而是随着编码的进行同时构造Huffman树,因此,只需要进行一次扫描即可。
在接收端伴随着解码过程同时进行着编码树的构造。
自适应霍夫曼编码解决了静态编码树所面临的主要问题,因此在实际领域比如在高质量的图像和视频流传输中中获得了广泛的应用。
(2)自适应霍夫曼编码的原理
这种方案在不需要事先构Huffman
树,而是随着编码的进行,逐步构造
Huffman
树。
同时,这种编码方案对符号的统计也动态进行,随着编码的进行,同一个符号的编码可能发生改变(变得更长或更短)。
由于自适应
编码算法采用了先编码,后调整编码树的方案,相应的解码算法比较简单。
解码算法也使用仅有唯一的
NYT
节点的编码树作为初始状态,然后根据Huffman编码数据流,对符号进行还原。
每次处理完一个符号,就使用这个符号调整编码树。
这样,在每一次输入新的符号之前,Huffman
树都处于与进行编码时使用的的Huffman
树完全相同的状态,保证了解码的正确性。
自适应霍夫曼编码是一种扩展的熵编码方法,相比于先前的静态霍夫曼编码,自适应霍夫曼编码具有仅需单遍扫描、无需传送编码树、能够对输入符号流的局部统计规律变化做出反应等一系列优点,具有更高的压缩效率。
这些优点使得它在一些实时性、可靠性要求比较高的场合得到了广泛的应用,被称为近代压缩算法的灵魂。
五、仿真
用MATLAB实现图像的霍夫曼编码和解码,代码如下:
closeall;
clearall;
clc;
I=imread('
lena.bmp'
);
I=im2double(I)*255;
[height,width]=size(I);
%求图像的大小
HWmatrix=zeros(height,width);
Mat=zeros(height,width);
HWmatrix(1,1)=I(1,1);
fori=2:
height%以下将图像像素值传递给矩阵Mat
Mat(i,1)=I(i-1,1);
end
forj=2:
width
Mat(1,j)=I(1,j-1);
height%以下建立待编码的数组symbols和每个像素出现的概率矩阵p
forj=2:
Mat(i,j)=I(i,j-1)/2+I(i-1,j)/2;
end
Mat=floor(Mat);
HWmatrix=I-Mat;
SymPro=zeros(2,1);
SymNum=1;
SymPro(1,1)=HWmatrix(1,1);
SymExist=0;
fori=1:
height
forj=1:
fork=1:
SymNum
ifSymPro(1,k)==HWmatrix(i,j)
SymPro(2,k)=SymPro(2,k)+1;
SymExist=1;
break;
ifSymExist==0
SymNum=SymNum+1;
SymPro(1,SymNum)=HWmatrix(i,j);
SymPro(2,SymNum)=1;
SymPro(3,i)=SymPro(2,i)/(height*width);
symbols=SymPro(1,:
p=SymPro(3,:
[dict,avglen]=huffmandict(symbols,p);
%产生霍夫曼编码词典,返回编码词典dict和平均码长avglen
actualsig=reshape(HWmatrix'
1,[]);
compress=huffmanenco(actualsig,dict);
%利用dict对actuals来编码,其结果存放在compress中
UnitNum=ceil(size(compress,2)/8);
Compressed=zeros(1,UnitNum,'
uint8'
UnitNum
8
if((i-1)*8+j)<
=size(compress,2)
Compressed(i)=bitset(Compressed(i),j,compress((i-1)*8+j));
NewHeight=ceil(UnitNum/512);
Compressed(width*NewHeight)=0;
ReshapeCompressed=reshape(Compressed,NewHeight,width);
imwrite(ReshapeCompressed,'
CompressedImage.bmp'
'
bmp'
Restore=zeros(1,size(compress,2));
Restore((i-1)*8+j)=bitget(Compressed(i),j);
decompress=huffmandeco(Restore,dict);
%利用dict对Restore来解码,其结果存放在decompress中
RestoredImage=reshape(decompress,512,512);
RestoredImageGrayScale=uint8(RestoredImage'
+Mat);
imwrite(RestoredImageGrayScale,'
RestoredImage.bmp'
figure;
subplot(1,3,1);
imshow(I,[0,255]);
%显示原图
subplot(1,3,2);
imshow(ReshapeCompressed);
%显示压缩后的图像
subplot(1,3,3);
imshow('
%显示解压后的图像
六、结论
霍夫曼编码是一种根据字母的使用频率而设计的变长码,能提高信息的传输效率,有时称之为最佳编码,广泛应用于文件传真,语声处理和图像处理的数据压缩中,但霍夫曼仍然存在着不足,若是能克服这些不足,霍夫曼编码的运用将更为广泛。
参考文献
[1]关可,王建新,亓淑敏.信息论与编码技术[M].北京:
清华大学出版社,2009
[2]曹雪虹,张宗橙.信息论与编码[M].北京:
清华大学出版社2009
[3]田宝玉,杨洁,贺志强,王晓湘.信息论基础[M].北京:
人民邮电出版社,2008
[4]
沈世镒,陈鲁生.编码理论基础[M].北京:
科学出版社,2002
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图像 霍夫曼 编码