MPEG4 & H.264学习笔记之三 ------ 熵编码

3.5 熵编码
熵编码把一系列用来表示视频序列的元素符号转变为一个用来传输或是存储的压缩码流.输入的符号可能包括量化的变换系数(像上面所说的运行级或零树),运动向量(对于每个运动补偿块的向量值x和y),标记(在序列中用来表示重同步位的点),头(宏块头,图象头,序列的头等)以及附加信息(对于正确解码来说不重要的信息).在这一节中,我们将介绍一些预测性的预编码的方法(用来表示编码帧中的区域关系)在之后接着介绍两种被广泛使用的熵编码技术----修改后的哈夫曼编码和算术编码.

3.5.1 预测编码
在图象的某些区域中,某些符号是高度相关的.比如说,相邻的intra编码块的平均值或DC值是非常相近的,相邻的运动向量可能会有相似的x和y值,等等.编码效率可以由从前面编码的数据预测当前块或宏块的元素,并编码它们之间的差异值来进行提高.一个块或宏块的运动向量指明了在之前编码的帧的预测参考值的编移量.相邻块或宏块的向量经常是相关的因为物体的运动可能会经过帧的一个很大的区域.这对于很小的块或有大量运动物体的运动来说尤其是如此的.运动向量的压缩可以由从之前的编码向量来预测每个运动向量来改进.一个对于当前宏块X的向量的简单的预测是水平相邻的宏块A,三个或更多的之前编码的向量可以被用来预测宏块X的向量(比如A,B和C).预测的和实际运动向量的差值被编码并传输.

量化参数或量化器步长控制了压缩效率和图象质量的平衡量.在实时的视频编解码中,在一个编码帧中修改量化是必要的(例如改变压缩率来使编码码率与传输信道码率相适应).在相邻的宏块中很小的改变参数值就是足够的了.修改了的量化参数必须告诉解码器,而我们不把新的量化参数值传输走,而是传输一个差异值(比如+1,-1或+2,-2)来表示这个参数值变化了多少.因为用来编码差异值要比编码整个量化参数来说要使用更少的位.

3.5.2 变长编码
一个变长的编码器把输入符号映射到一系列的码字(VLC).每个符号映射到一个码字,而码字有变化的长度但是必须包括整数个位.经常出现的符号用短的VLC来表示,而不常出来的符号用长的VLC来表示.对于大量压缩符号来说,这样的操作会让压缩率提高.

3.5.2.1 哈夫曼编码
哈夫曼编码向每个VLC进行赋值的方法是基于对于不同的符号的出现机率的不同来定的.根据Huffman在1952年提出的原始设想,计算每个符号的出现机率是必要的,用这个结果来构造一系列的变长的码字.

如果分布机率值是准确的,那么哈夫曼编码提供了一种对于原始数据来说很有效的压缩方法.然而,为了达到最优化的压缩,对于不同序列的不同的码表是需要的.

3.5.2.2 预计算的哈夫曼编码
哈夫曼编码过程对于视频的编解码有两个不利的地方.首先,解码器必须使用在编码器设置的相同的码字来进行解码.传输这些信息到解码端会加大传输内容,并降低压缩效率,尤其对于短的视频序列来说.第二,对于大的视频序列的可能性值表在视频数据编码之前是不能得到的,这就会造成一些在编码过程的延时.由于这些原因,近来的图形和视频编码标准基于通常的视频序列的统计模型进行编码,用来解决这个问题.

变换系数(TCOEF)
MPEG-4视频部分使用量化系数的3D编码,它们使用每个码字来表示一个(run,level,last)的组合.总共102个特定的(run,level,last)组合有VLC值.在每个码字的last位是's',用来指明符号的解码系数符号(0表示正,1表示负).

一个包含超过八个0的run值的码字是无效的,这样任何以000000000开始的码字都表示码流中有错误.所有的其他序列都可以被用有效的编码值来进行解码.注意最小的码被赋给小的run和小的level值中,因为它们发生的机率比较大.

运动向量差(MVD)
差值编码的运动向量被编码为一对VLC,一个是对于x值的,一个是对于y值的.注意最短的码表示小的运动向量差值(比如MVD=0表示简单的码值1).这些码表与哈夫曼值是非常相似的,因为每个符号都被赋给了唯一个码字.通常用的符号被赋了短码字,在单独的一个表中,没有码字的前缀是同其他码字相同的.

3.5.2.3 其他的变长编码
与哈夫曼和基于哈夫曼的编码一样,一些其他的VLC方法被用在了视频编码的程序中.基于哈夫曼编码的一个很大的不利是它们对于传输错误是敏感的.在VLC序列的错误会导致解码器损失同步信息,并不能正确地进行解码,这样就导致了使解码处于混乱状态.一个预定义的编码表的缺点在于解码端和编码端必须保存同样的码表.一个可代替它的方式是用如果输入的符号已知时可自生成码的方法,比如说指数Golomb编码法.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在调用 `scipy.stats.entropy` 函数时,如果出现 `-inf` 的错误,很可能是因为你传入的概率分布数组中存在概率值为0的情况。这会导致计算信息的时候出现无限大的负数。为了避免这种情况,可以在计算之前将数组中的概率值都加上一个很小的数,例如1e-10。这样可以避免概率值为0的情况,同时也不会对计算结果造成太大的影响。 例如: ``` p = [0.5, 0.5] entropy(p) # Output: -inf p = [0.5, 0.5] + 1e-10 entropy(p) # Output: 0.6931471805599453 ``` ### 回答2: 当使用Python中的scipy.stats库中的entropy函数时,可能会遇到返回-inf(负无穷大)的情况。这是由于输入的概率分布有问题造成的。 entropy函数用于计算给定概率分布的(entropy)。是对随机变量的不确定性的度量,它取决于概率分布的形状和离散程度。如果概率分布中存在概率为0的事件,entropy函数就会返回-inf。 一种可能的情况是,当概率分布中的某些事件的概率为0时,entropy函数会返回-inf。这意味着这些事件是确定性事件,概率是零,因此它们对整体的不确定性没有贡献。 解决这个问题的方法是检查输入概率分布,确保每个事件都有非零的概率。如果发现有概率为0的事件,可以通过增加一个很小的非零概率来修复它们,以避免entropy函数返回-inf。 另一种可能的情况是输入的概率分布不是标准概率分布,即概率之和不等于1。在这种情况下,经过调整的概率分布可能会导致entropy函数返回-inf。要解决这个问题,需要确保概率分布的总和为1,可以通过归一化概率分布来实现。 总之,当使用Python中的scipy.stats库的entropy函数时,遇到-inf的问题是由于输入的概率分布有误导致的。检查概率分布中是否存在概率为0的事件,并通过增加一个很小的非零概率来修复它们,或者确保概率分布的总和为1,可以解决这个问题。 ### 回答3: 当使用Python调用`from scipy.stats import entropy`时,如果出现`-inf`的情况,可能是由于输入的概率分布中存在概率为零的事件导致的。 是概率分布的一个度量,它衡量了该分布的不确定性或信息量。在计算时,需要通过传递一个概率分布数组作为输入。 如果概率分布中存在概率为零的事件,即某个事件的概率为0,就会导致的计算结果为`-inf`。这是因为在信息论中,概率为零的事件被认为是绝对确定性的事件,因此它不会提供任何信息,也就变为负无穷。 为了避免出现`-inf`的情况,需要确保输入的概率分布中没有概率为零的事件。可以检查传递给`entropy`函数的概率分布数组,查看是否存在概率为零的元素。如果存在,可以尝试调整输入的概率分布,确保所有的概率都大于零或非零,并再次进行计算。 另外,还可以检查代码中是否存在其他问题,比如使用了不正确的数据类型或输入格式,这些问题也可能导致`-inf`的结果。 综上所述,当Python调用`from scipy.stats import entropy`时出现`-inf`的情况,可能是因为输入的概率分布中存在概率为零的事件,需要检查并调整概率分布,确保输入的概率都大于零或非零。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值