四. 压缩编码

只有在保持信号质量的前提下,设法降低码率及数据量,才能使标准得到应用。而这种降低码率的过程,被称为压缩编码或新源编码.

压缩编码又可以分为无损压缩,有损压损,混合压缩.

  1. 莫尔斯
  2. 哈夫曼
  3. 游程编码 RLC
  4. 算术编码
  5. 香农-费诺编码
  6. Lempel-Zir 编码

莫尔斯编码

莫尔斯码就是大家熟悉的电报码,它的发明为人类做出了巨大的贡献.该码采用"."和"-"来表示 26 个英文字母,这实质上还是二进制码(点为"0",而杠为"1"),但是它没有采用固定字长的编码方式,而是采用了常用字母用短码表示(如 E 用"."表示,T 用"-"表示),不常用字母用长码表示(如 Z 用"--.."表示,j 用"-..-"表示)的变长编码方式.通过对英文单词进行大量统计,找出各字母的概率,最后确定有 12 个字母出现概率最低,用 4bit 数字表示,有 8 个字母出现概率较低,用 3bit 数字表示;有 4 个字母出现概率较高,用 2bit 数字表示;有两个字母出现概率最高,用 1bit 表示,共 26 个字母.

  • 其中出现概率最低的 12 个字母共需 12*4bit = 48bit
  • 其中出现概率较低的 8 个字母共需 8*3bit = 24bit
  • 其中出现概率较高的 4 个字母共需 4*2bit = 8bit
  • 其中出现概率最高的两个字母共需 2*1bit = 2bit

这样可以算出 26 个字母中每个字母的平均码长为:(48+24+8+2)/26 = 3.15 位/字母
而要用固定码长方式则需要 2 的五次方=32,即 5bit 来表示.显然平均码长减低了近 2/5,达到了压缩的目的,而这种压缩对于信息无任何损坏,属于无损压缩.
由此看来改变吗的规律是:先找出统计规律,然后对出现概率打的用短码,反之用长码,从而使码率降低.

其实我们后面的文字编码标准也采用了这种思想,像 UTF-8 中数字占 1 个字节、英文字母占 1 个字节,常用中文字符占用 3 个字节(大约 2 万多字),但超大字符集中的更大多数汉字要占 4 个字节(在 unicode 编码体系中,U+20000 开始有 5 万多汉字)

预测编码

根据以上分析,可以设想,在对视频信号的数字化过程中,发送端处理货传输的不同图像中当前样值本身,而是该样值与前一个(相邻)样值的差值,则这些差值绝大部分是很小的或者为零,可以用短码来表示,而对那些出现概率较低的较大差值,用长码来表示,则可是总体码数下降.这种采用对相邻样值差值进行变长编码方式成为差值编码,又称为差分脉冲调制(DPCM).在接收端,将已得到的前一样值与刚收到的差值相加,就可还原出所要的当前样值.

从另一个角度看,可以把前一个样值看成是当前样值的的预测值,并与当前样值相减,得到一个差值(预测错误).该差值可以看成是当前要传送的样值对于预测值的修正值,并对该差值编码,传送,这样在接收端,可以将已得到的前一个样值加上这一解码后的修正值,就得到了一个正确的当前样值.因此差值编码也可以称为预测编码

从图中可以看出,在信号的发送端,当前样值 Vi(n)一路直接送入减法器,而另一路则送入延时线 TS(预测器),其延迟时间定为一个采样周期,此时,从 TS 输出的出二样值的差值(预测误差),该预测误差应为:ΔVi(n)=Vi(n)-Vi(n-1)经过量化器 Q 量化后,ΔVi'(n)为ΔVi(n)+ε(n).其中ε(n)为量化误差或称量化噪声.在信号接收端,差值信号(预测误差)ΔVi(n)+ε(n)经过逆量化器 Q(-1)的 D/A 变换后,把该信号(包括ε(n))送入加法器,并经过延时线 TS 延迟一个采样周期的前一个输出样值(预测值)Vo(n-1)相加,从而又得到当前样值 Vo(n).从以上过程可以看出,发送端输出的是当前样值与前一样值的差值,而接收端将该项预测误差与前一输出样值相加,又还原为当前样值,因此差值编码是可以实现图像信号的压缩,传输与还原的.

霍夫曼(Huffman)编码

是根据图像的相关性以及大量统计,找出了图像像素样值的预测规律.这为去除相关性,进行差值传输,提供了依据,打下了基础,然而这只是信源编码中的一个方面,另一个方面则是对差值信息(预测误差)进行熵编码(Entropy Coding),而不是普通意义上的数值编码.

熵编码是一类无损编码,它是因为编码后的平均码长接近信源的熵而得名.在熵编码中,一般多采用可变字长编码方式.其基本思想是对信源中出现概率大的对象用短码表示,而出现概率较小的对象用长码表示,从而统计上获得较短的平均码长.其中所指对象并没有规定是某种模拟或数字信息,它只是一个欲编码的对象或符号.熵编码要求所编的码应是即时可译码,短码不应与长码的码首重复,各码之间无需附加信息便可自然分开.

与莫尔斯码类似,霍夫曼码也属于熵编码.它是在数字视频中应用的一类可变长编码.其编码的具体方法是:

  1. 首先将欲编码的信源对象(在预测编码中应是量化后的预测误差),按出现的概率由大到小排成一列
  2. 找出最小的两个概率点,大的用码元"1"表示,小的用码元"0"表示(如概率相等,可自行确认"0"和"1"分配方式
  3. 再将这两个概率点的概率相加,生成一新的概率点,随后在新的概率点和余下的概率点中选出两个最小的概率点比较,大着为"1",小者为"0".
  4. 再将这两个概率点的概率相加,生成一个新的概率点,
  5. 以此类推,直至新的概率点的概率为 1 为止.
  6. 最后沿着由对象符号到概率为 1 的路劲,将该路径上的"1"和"0"记录下来,便得到了各信源对象的霍夫曼编码.

下图是 7 个信源"对象 x1~x7 的霍夫曼编码图:

上图示出了霍夫曼编码过程,如果采用固定码长的编码方式,此例中 7 个对象需 3 位码长,而采用了霍夫曼编码后,其平均码长为:

霍夫曼编码实际上是一种映射码,其与被编码对象的物理参数无关,是根据"对象"出现的概率而编制的.一旦编成,则霍夫曼码与对象是一一对应的,而与概率无关.

变换编码(视频编码)

4.1 离散余弦变换
时域到频域的转化
4.2 DTC 系数量化
对 DCT 系数的量化是基于限失真(Finite Distortion)编码理论进行的.它允许 DCT 系数经量化后,对图像造成一定的失真,但这种失真应在人的视觉所能接收的容限之内.
根据 FDCT 系数矩阵的不同区域,分配不同的量化步长的量化方法,称为区域滤波法.
4.3 Zig-Zag 扫描
量化后的 DCT 系数仍然是二维系数矩阵,要进行数据传输,还需要将其变为一维数据序列.Zig-Zag 扫描采用的是 Z 字形扫描方式.这主要是因为,在量化后的 DCT 系数矩阵中,非 0 的数据主要集中于矩阵的左上角.从直流分量 DC 开始进行 Z 字形扫描,可以增加连续 0 系数的个数,也就是增加 0 的游程长度.这样对传输中的数据压缩十分有利.
4.4 游程编码(RLC)
量化后的 DCT 系数矩阵,经过 Zig-Zag 扫描后变变为了以为数组序列,然后这一数组序列的尾部都是连续的 0 数据,这些连续 0 数据的个数称为游程.为了避免在数据传输中,逐个第传送 0 数据,进一步实现数据压缩,需要对这一维数组进行游程编码.游程编码的方法是将扫描得到的一维数组序列,转换为一个由二元数组(num,level)组成的数组序列,其中 num 表示连续 0 的长度,level 表示这串连续 0 之后出现的一个非零值,后面所有剩余的连续 0,用符号 EOB 来表示.
4.5 熵编码

posted on 2023-01-05 09:32  WillingCPP  阅读(654)  评论(0)    收藏  举报

导航