1700506886
1700506887
在前面获得8×8的频率振幅描述矩阵之后,再用这个矩阵与量化表中相应的值相除来进行振幅的压缩。如图9-19所示:左上角的除数比较小,而右下角的除数比较大,这就意味在相除之后低频的描述信息仍然比较丰富,而高频信息几乎没有了;左侧的低压缩率量化表和右侧的高压缩率量化表只是商的系数不同,高压缩率量化表在做除法的时候,显然由于除数很大而得到了更大的压缩幅度。
1700506888
1700506889
1700506890
1700506891
1700506892
图9-19 JPEG量化表
1700506893
1700506894
最后就是进行遍历和对遍历后的序列进行无损的哈夫曼压缩编码(如图9-20所示)。
1700506895
1700506896
1700506897
1700506898
1700506899
图9-20 遍历与编码
1700506900
1700506901
对图像压缩信息进行解压缩是刚刚这些步骤的逆过程,因为在压缩中有一些步骤是有损的,对高频分量进行了舍弃,所以在还原的时候无法获得和原始的RGB三通道或BITMAP相同的精度,但这个问题造成的影响很有限。
1700506902
1700506903
今天在互联网中大量使用的 .JPG文件就是基于这样的一种压缩思路,是不是非常巧妙呢?互联网能有如此之快的发展速度,与信息论及由它作为理论基础所发展而来的一系列强大的算法理论体系有着密不可分的关系。
1700506904
1700506905
3.视频
1700506906
1700506907
在本节的最后,我们讨论一下视频信息的压缩问题。
1700506908
1700506909
视频是现在在互联网环境中非常常见的一种媒体形式,不论是视频流还是视频文件,我们天天都会接触。
1700506910
1700506911
视频是一种典型的多媒体信息。我们通常说的视频是指图像信息和音频信息两个独立部分叠加的内容。对老的国产动画片有研究的读者估计会比较清楚,不论是像《大闹天宫》这样的工笔画动画片,还是像《阿凡提》这样的银丝木偶动画片,都是一帧一帧拍出来的(如图9-21所示)。
1700506912
1700506913
1700506914
1700506915
1700506916
图9-21 动画片《大闹天宫》和《阿凡提》
1700506917
1700506918
人眼对连续运动的物体的敏感度也是有限的,一幅一幅的静态画面快速连续播放,就能让人得到视觉动感。一般来说,大于30fps(8)就不会让人感到明显的动作跳跃感,换言之,视频文件的画面部分存储了大量的一帧一帧的静态画面信息,然后快速播放给观众看,这种技术原理在视频流和视频文件中通用。在前面我们已经知道,单幅静态画面可以通过离散余弦变换来进行信息压缩(牺牲一些高频分量来获取较高的压缩比),那么对动态画面有什么更好的处理方法吗?也是有的。
1700506919
1700506920
以H.264(9)编码标准为例,由于视频本身的特点,相邻的帧之间通常相似度比较高,像素、亮度、色度的变化都非常小。所以,对一段变化不大图像,可以考虑用数据增量的方式实现,这样做会节省大量的传输带宽。
1700506921
1700506922
H.264编码标准定义了3种帧(如图9-22所示)。完整编码的帧叫作I帧,又称“内部画面帧”(Intra Frame)。I帧中是一帧完整的图像信息。参考之前的I帧生成的只包含差异部分编码的帧叫作P帧,又称“预测帧”(Predictive Frame)。还有一种参考前后的帧编码的帧叫作B帧(Bi-Directional Frame)。当把一帧压缩成B帧时,它会根据相邻的前一帧、本帧及后一帧数据的不同点来压缩本帧,也即仅记录本帧与前后帧的差值。只有采用B帧压缩才能达到200∶1的高压缩比。H.264编码标准采用的核心算法是帧内压缩和帧间压缩相结合的方法,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
1700506923
1700506924
1700506925
1700506926
1700506927
图9-22 时间序列上的I帧、B帧和P帧
1700506928
1700506929
一个I帧到下一个I帧之前的部分叫作一个画面组(Group of Pictures,GOP)。接收端收到连续不断的GOP,就可以连续不断地根据I帧、P帧和B帧中记录的差异量逐帧进行完整的复原,再在显示环节进行渲染,这样就能还原出原始的视频信息。在一个GOP中,只要I帧不丢失,那么即使有个别P帧或者B帧丢失,对画面感官的影响也是有限的。如果I帧丢失,那么整个GOP所附带的信息就没有还原的可能了,画面观感会非常差,有可能会严重花屏或黑屏,这样就只能等着下一个I帧的到来,从而得到一帧完整的画面信息。
1700506930
1700506931
如果读者做过DBA,或者对Oracle数据库比较熟悉,就能很容易联想到,这种方式和Oracle进行全量备份和增量备份的方式相同。通过一次完整的库扫描,把数据块的信息用RMAN进行备份,之后要进行增量备份时,只需要备份那些从上次备份时起到当前时间为止的有变化的块信息,而不需要备份整个数据库,节省了大量的时间。
1700506932
1700506933
1700506934
1700506935
[
上一页 ]
[ :1.700506886e+09 ]
[
下一页 ]