参考书《数据压缩导论(第四版)》Page 66
2、 利用程序huff_enc和huff_dec进行以下操作(在每种情况下,利用由被压缩图像生成的码本)。
(a) 对Sena、Sensin和Omaha图像进行编码。
(b) 编写一段程序,得到相邻之差,然后利用huffman对差值图像进行编码。
答:(a)我对其代码进行编译后得到的结果如下:
文件名 | 压缩前大小 | 压缩后大小 | 压缩比 |
OMAHA.IMG | 64KB | 57KB | 89.06% |
SENA.IMG | 64KB | 56.1KB | 87.66% |
SINAN.IMG | 64KB | 60.2KB | 94.06% |
(b)
4、 一个信源从符号集A={a1, a2, a3, a4, a5}中选择字母,概率为P(a1)=0.15,P(a2)=0.04,P(a3)=0.26,P(a4)=0.05,P(a5)=0.50。
(a)计算这个信源的熵。
(b)求这个信源的霍夫曼码。
(c)求(b)中代码的平均长度及其冗余度。
答: (a)由于P(a1)=0.15,P(a2)=0.04,P(a3)=0.26,P(a4)=0.05,P(a5)=0.50,
则这个信源的熵为H=-0.15*log20.15-0.04*log20.04-0.26*log20.26-0.05*log20.05-0.50*log20.50
= -0.15*(-2.74) -0.04*(-4.64) -0.26*(-1.94) -0.05*(-4.32) -0.50*(-1)
=0.4105+0.1858+0.5053+0.2161+0.5
=1.8177(bit)
(b)由题意可得,这个信源的霍夫曼码为:
步骤一:为每个字符创建一个集合
字母 | 码字 | 概率 | 集合 | 集合的概率 |
a1 | 0.15 | a2 | 0.04 | |
a2 | 0.04 | a4 | 0.05 | |
a3 | 0.26 | a1 | 0.15 | |
a4 | 0.05 | a3 | 0.26 | |
a5 | 0.5 | a5 | 0.5 |
步骤二:对最前面集合的字母的码字中插入前缀“1”,对第二个集合的字母的码字中插入前缀“1”,并合并最前面的两个集合,然后排序
字母 | 码字 | 概率 | 集合 | 集合的概率 |
a1 | 0.15 | a2a4 | 0.09 | |
a2 | 1 | 0.04 | a1 | 0.15 |
a3 | 0.26 | a3 | 0.26 | |
a4 | 0 | 0.05 | a5 | 0.5 |
a5 | 0.5 |
步骤三:重复步骤二
字母 | 码字 | 概率 | 集合 | 集合的概率 |
a1 | 0 | 0.15 | a2a4a1 | 0.24 |
a2 | 11 | 0.04 | a3 | 0.26 |
a3 | 0.26 | a5 | 0.5 | |
a4 | 10 | 0.05 | ||
a5 | 0.5 |
步骤四:重复步骤二
字母 | 码字 | 概率 | 集合 | 集合的概率 |
a1 | 10 | 0.15 | a2a4a1a3 | 0.5 |
a2 | 111 | 0.04 | a5 | 0.5 |
a3 | 0 | 0.26 | ||
a4 | 110 | 0.05 | ||
a5 | 0.5 |
步骤五:重复步骤二
字母 | 码字 | 概率 | 集合 | 集合的概率 |
a1 | 110 | 0.15 | a1a2a3a4a5 | 1 |
a2 | 1111 | 0.04 | ||
a3 | 10 | 0.26 | ||
a4 | 1110 | 0.05 | ||
a5 | 0 | 0.5 |
综上可得: a1 的码字为为110;
a2 的码字为1111 ;
a3 的码字为10 ;
a4 的码字为1110 ;
a5 的码字为0 。
(c) 由(b)可得:
代码的平均长度为L=0.15*3+0.04*4+0.26*2+0.05*4+0.5*1
=0.45+0.16+0.52+0.2+0.5
=1.83(bit)
冗余度为:熵值-平均长度=H-L=1.83-1.8177=0.0123(bit)
5、 一个符号集A={a1, a2, a3, a4,},其概率为P(a1)=0.1,P(a2)=0.3,P(a3)=0.25,P(a4)=0.35,使用以下过程找出一种霍夫曼码:
(a)本章概述的第一种过程:
(b)最小方差过程。
解释这两种霍夫曼码的区别。
答:(a)由题意可得,用本章概述的第一种过程则这个信源的霍夫曼码为:a1 的编码为111;
a2的编码为10;
a3的编码为110;
a4的编码为0.(概率是按降序排列,从而来划分的)
(b)用本章概述的Huffman编码得到的这个信源的霍夫曼码为:
步骤一:为每个字符创建一个集合
字母 | 码字 | 概率 | 集合 | 集合的概率 |
a1 | 0.1 | a1 | 0.1 | |
a2 | 0.3 | a3 | 0.25 | |
a3 | 0.25 | a2 | 0.3 | |
a4 | 0.35 | a4 | 0.35 |
步骤二:对最前面集合的字母的码字中插入前缀“1”,对第二个集合的字母的码字中插入前缀“1”,并合并最前面的两个集合,然后排序
字母 | 码字 | 概率 | 集合 | 集合的概率 |
a1 | 1 | 0.1 | a2 |
0.3 |
a2 | 0.3 | a4 |
0.35 | |
a3 | 0 | 0.25 | a1a3 |
0.35 |
a4 | 0.35 |
步骤四:重复步骤二
字母 | 码字 | 概率 | 集合 | 集合的概率 |
a1 | 1 | 0.1 | a1a3 |
0.35 |
a2 | 1 | 0.3 | a2a4 |
0.65 |
a3 | 0 | 0.25 | ||
a4 | 0 | 0.35 |
步骤三:重复步骤二
字母 | 码字 | 概率 | 集合 | 集合的概率 |
a1 | 1 1 | 0.1 | a1a2a3a4 | 1 |
a2 | 0 1 | 0.3 | ||
a3 | 1 0 | 0.25 | ||
a4 | 00 | 0.35 |
综上可得:
a1 的编码为11;
a2的编码为01;
a3的编码为10;
a4的编码为00.
用上述的两种方法这个信源的平均码长L=2(bit)
第一种方法的方差S12=0.35*(1-2)2+0.3*(2-2)2+(0.25+0.1)*(3-2)2=0.7
第二种方法的方差S22=(0.35+0.1+0.3+0.25)*(2-2)2=0
综上所述,两种方法的平均码长相同,根据最小方差过程,第二种方法的码长变化较小,比较接近平均码长,所以第二种方法更容易实现。
参考书《数据压缩导论(第4版)》 Page 30
2-6. 在本书配套的数据集中有几个图像和语音文件。
(a)编写一段程序,计算其中一些图像和语音文件的一阶熵。
(b)选择一个图像文件,并计算其二阶熵。试解释一阶熵和二阶熵之间的差别。
(c)对于(b)中所用的图像文件,计算其相邻像素之差的熵。试解释你的发现。
答:(a)根据老师给出的代码我进行了调试,得出图像和语音文件的一阶熵、二阶熵和差分熵的结果如下:
文件名 | 一阶熵 | 二阶熵 | 差分熵 |
EARTH(IMG) | 4.770801 | 2.568358 | 3.962697 |
OMAHA(IMG) | 6.942426 | 4.488626 | 6.286834 |
SENSIN(IMG) | 7.317944 | 4.301673 | 4.541547 |
SENA(IMG) | 6.834299 | 3.625204 | 3.856989 |
BERK(RAW) | 7.151537 | 6.705169 | 8.976150 |
GABE(RAW) | 7.116338 | 6.654578 | 8.978236 |
test(txt) | 4.315677 | 3.122731 | 6.099982 |
(b)我选择的是图像SENA,
根据(a)所得图像SENA的一阶熵为6.834299(bit),二阶熵为3.625204(bit).
所以一阶熵和二阶熵之间的差别是一阶熵比二阶熵大。
(c)图像SENA相邻像素之差的熵为3.856989:
我的发现是:对于图像的相邻像素之差的熵是介于一阶熵和二阶熵之间的,也许差分熵更加接近图像的真正的存储大小。
从今天起,做个幸福的人。