数字媒体技术之自适应Huffman树基础、JPEG压缩的实现(python2.7)

第一题

github地址
第一题
第一题:
8.(a)赫夫曼算法需要有关信息源的先验统计知识,而这样的信息很难获得,特别是多媒体类应用,数据在到达之前是未知的,所以无法得到这些统计数据。而且统计数据符号表的传输依然是一笔很大的开销。
(b)i. 除去中间的00是NEW之外,传输的字符是bacc,树的变化在ii。
①第一次传的时候01是b,之后树变换为图1;
②之后传输的是01,由图1可以看出01此时为a,树变换为图2;
③之后传输00,也就是一个新字符,新字符为10查找初始的编码为c,此时树变换为图3-2;
④之后传输101,由图3-2可以看出101此时为c,树变换为图4。
综上传输的字符为bacc。
ii.
传第一个01(b)之后:
在这里插入图片描述(图1)
第二个01(a)之后:
在这里插入图片描述(图2)
第三个00,第四个10(c)之后:
在这里插入图片描述(图3-1)
在这里插入图片描述(图3-2)
第五个101(c)之后:
在这里插入图片描述(图4)

第二题

第二题的源码下载
第二题
第二题:
理论原因分析:
GIF压缩是采用无损压缩技术,图像不多于256色则既可以减少文件的大小又可以保持质量,普遍用于图标按钮等只需要少量颜色的图像,如黑白图。主要由87a和87b两个版本。
JPEG压缩是有损压缩技术,通过对图像进行色彩空间转换,取样,DCT,量化,熵编码的过程来对图像进行压缩,不适用与线条绘图和其他文字和图标的图形。
GIF压缩是将图片转换成256色进行传输,256色中每个颜色都有索引值,然后传输方传输索引值(如果索引表没有统一,那么连同索引表一起传输)。Jpeg是将每个8*8压缩并编码成大小不一的数据流,然后将所有数据流传输,接收方接收数据流并根据huffman表和量化表进行还原(如果双方表没有统一,也需要连同图片一起传输)。
所以总的来说,GIF适用于颜色数量少、图像细节不明显的图像,因此本题中更适合卡通图片的压缩;而JPEG压缩的话,对于颜色多细节多的图像效果会比GIF好得多,细节多的图像在JPEG处理之后,压缩比比较高,更适用于本题中的动物图片。

程序实现部分(JPEG):
程序实现语言:python
版本:py2.7
程序文件概括:
在这里插入图片描述
主函数为jpeg.py,include文件夹中是编码和解码的各个函数(Fill填充、Sample采样、Block取块、Quantization_DCT进行DCT并量化、Zigzag排序、Shang_coding进行DC的DPCM编码和AC的游长编码,并转化为熵编码)。
运行:jpeg.py目录下直接运行即可,压缩文件与py文件在同个目录下,生成的图片文件存储为?_jpeg.jpg,如下,其中DCT和IDCT因为没有使用内置的dot方法,导致耗时约20s,请耐心等待:
在这里插入图片描述
①颜色转换(jpeg.py中)
根据公式进行颜色的转换,RGB转YUV如下:
在这里插入图片描述
YUV转RGB如下:
在这里插入图片描述
②填充(Fill.py
由于图片的长宽都需要满足是16的倍数(采样长宽会缩小1/2和取块长宽会缩小1/8),所以需要将图片填充至16的倍数。
填充的函数如下,newsize最终是填充结束的大小,size是原来的大小。填充的像素经测试,不会影响原来的图片,所以填充0即可。
在这里插入图片描述
返回时,要进行截取,使图片变回原来的大小:
在这里插入图片描述
③采样(Sample.py
采样是对YUV三个表中的UV进行的,采样操作比较简单,本次使用的采样是比较容易实现的4:1:1,也就是每一个22方块中,只去左上角的值。
在这里插入图片描述
④取块(Block.jpg)
JPEG标准中,使用的是8
8块的处理,所以把YUV截成若干88矩阵。
在这里插入图片描述
⑤DCT和量化(Quantization_DCT.py)
DCT函数和IDCT函数,C()函数求出DCT中的系数。
在这里插入图片描述
在这里插入图片描述
JPEG中重要的一环,亮度和色度量化表在jpgeMatrix.py中。
量化函数:
在这里插入图片描述
反量化函数:
在这里插入图片描述
⑥Zigzag排序
Zigzag排序没有直接使用初始化一个Zigzag排序,因为Zigzag的排序有规律可寻。Index有四个方向:右上、右、下、左下。除了右上和左下,每次变换方向为右或者下,则下一步是右上或者左下。可以视为一个在8
8范围内的旋转(右上–右--下,左下–下--右)。
在这里插入图片描述
运行完存储Zigzag trans矩阵,方便逆Zigzag运算。
在这里插入图片描述
⑦编码
编码的过程包括:将上面的Zigzag矩阵转换成(count,number)的游长矩阵形式(可以也把DC变换成这种形式,便于一起存储),然后将number再次变换成VLI形式(位数和code的格式),加上前面的count最终是(count,位数,code)的格式。
接下来将count和位数的组合根据默认的huffman表(亮度或者色度的huffman表)变换成0101的形式。
⑧统计
最后统计上述编码结束后的01的bit数,与原来图像的RGB总位数进行比较,算出压缩率。

结果对比:
原图和效果图在最后部分,效果图出现略微椒盐化,测试为量化函数有误差。图1(动物图片)的压缩率在12左右,动画图片在9左右。失真度发现动物图片的失真度小于动画图片。
GIF处理之后相比于JPEG更加模糊,失真度更高。GIF的压缩率大概在2左右。
总的来说,GIF的压缩效果和压缩率均不如JPEG,但是GIF的速度更快,可以运用在一些对图片细节要求不高的图片中(如动图),而且GIF的另外一个优势就是传输的时候可以从低清晰度开始传输,而JPEG是一行一行的传输,传输结束后才能看到整个图形,所以GIF对于传输速度慢的情况下更有优势。
原图1:
在这里插入图片描述
效果图1:
在这里插入图片描述

发布了36 篇原创文章 · 获赞 67 · 访问量 7万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览