基于DM642的MPEG-2视频压缩编码(二)

来源:互联网 发布:windows ie10补丁 编辑:程序博客网 时间:2024/05/29 07:33

这一篇讲量化因子的生成和可变长编码。

量化因子在整个编码过程当中起着至关重要的作用,它即决定了图像的质量也决定了图像的压缩比。而且量化因子也应该具有良好的适应性,因为每一个宏块的特征都不相同,所以各自的量化因子也是不一样的。以I帧为例,推导一下量化因子的生成。首先是量化因子的初始化得到的是prev_mquant.

 

而其中的d,r由下式得来





综上所述prev_mquant由bit_rate和frame_rate组成的各种繁琐的式子组成,至此,我们还没有看到量化因子的可适应性。所以在量化的时候当然不是用的prev_mquant。在帧内量化和帧间量化的过程中使用的mquant是存放在mbinfo这个结构体里的。而mbinfo[k].mquant是由函数rc_calc_mquant(k)得来,那又经过了哪些步骤呢?


这里面未知的就是Qj和N_actj,下面给出计算公式



关键性变量出现了,就是actj,这个变量是由何而来?又代表什么呢?

actj=var_sblk(p,width);而var_sblk(p,width)计算的是每一个块的内部的方差值,也就是块中的像素值是不是有较大的变化,由此我们知道对于每一个宏块都是由它本身决定着量化因子的大小,虽然之前列出了很多公式,但是我没有把他们合并成一个。。。太多了,只是找出了量化因子和宏块间的关系。


再讲一下量化后,编码前的扫描,将二维矩阵扫描成一维的,也就是将8*8的块扫描成64大小的数组,常用的zig_zag扫描也就是我们常说的之字形扫描,扫描矩阵为

zig_zag_scan[64]=
{
  0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
  12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
  35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
  58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
}

程序中我们又用到了另外一种扫描矩阵

alternate_scan[64]=
{
  0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
  41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
  51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
  53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
}

结合图片来看一下:


那么这两种扫描方式有什么区别呢?以下是由一篇论文而得:如果字块中包含较强的垂直频率分量,也就是非零DCT系数主要集中水平方向的低频部分。表现在像素亮度上则是块在水平方向上较为平坦,那么采用轮流垂直扫描,而帧间编码块的差值信号分布随机性比较大,一般适合之字形扫描,而且几乎一半以上的图像块适合之字形扫描。

下一篇再介绍可变长编码吧(鉴于篇幅原因)~


0 0
原创粉丝点击