A、变换量化过程总体介绍

  经过帧内(16x16和4x4亮度、8x8色度)和帧间(4x4~16x16亮度、4x4~8x8色度)像素块预测之后,得到预测块的残差,为了压缩残差信息的统计冗余,需要对残差数据进行变换和量化操作。变换和量化的总体操作过程如下图:

        

  对于Intra_16x16的亮度块,通过16(4x4)个4x4的前向DCT变换,然后对得到的16个DC系数再进行4x4的Hadamard变换,然后对于16个DC系数和240个AC系数进行量化(DC和AC的量化公式略有不同,为了控制量化死区大小,详见量化器设计)。

  对于8x8的色度块(帧内、帧间),进行4x4的DCT变换后,得到4个DC和60个AC系数,同样对于DC系数先进行2x2的Hadamard变换后,分别对DC和AC系数进行量化。

  由于变换块越大,编码的效率越高,且图像的细节信息越能得以保留。所以H.264在HD档次中,支持进行8x8的DCT变换(设置标志transform_size_8x8_flag=1),且不需要对DC系数进行Hadamard变换,DCT变换后对DC和AC系数进行统一的量化处理。

  然后对于其他尺寸的变换块(不是Intra_16x16、8x8色度,没有transform_size_8x8_flag=1标志),则简单采用4x4的DCT变换,然后直接对DC和AC系数进行统一量化。

B、量化介绍

  量化是通过多对一的映射,降低比特率。主要有均匀量化、非均匀量化和自适应量化。根据最优量化器设计准则:最佳量化区间的边界值为相邻两个最佳量化值的平均数,最佳量化值为所在量化区间的均值。

  1、简单的定长标量量化器公式如下:

    Z = int(|W|/S) * sng(W)。

  其中W表示输入值,S是量化步长,int(x)表示小于等于x的最大整数,sng(x)表示x的符号,取值-1、0、+1。

  反量化公式:

    W = S * Z;

    

  如图:在量化区间[n*S, n*S+S)中,残差量化值为n*S。量化不长S决定了量化的效果,S越大,量化器的压缩效率越高,但是相应的图像的失真越高。但是对于上述量化器,对于区间[0,S)的残差值,被量化成0,明显不符合最优量化器设计准则,所以引入量化偏移量f。

  2、变形量化器:引入量化偏移量f,公式如下:

    Z = int((|W| + f ) / S) * sng(W);

  反量化公式如下:

    W = S * Z;

      

  如图:在量化区间(F-S,S-F)中,量化值是0;在[S-F, 2S-F)中,量化值为S。由于区间(f-S, S-f)的残差量化为0,[S-f, 2S-f)的残差量化为S,所以此量化器就可以通过调节f的值,调节量化区间的最佳量化值,使得最佳量化值满足是该区间的均值(W是非均匀分布时也可以调节f达到最佳量化器的要求),因此f可以控制量化区间的偏移量。H.264的参考模型建议对于帧间预测时,f=S/6;对于帧内预测是,f=S/2。

  对于残差值属于(f-S, S-f)时,量化值是0,所以区间(f-S, S-f)被称为量化死区,通过f可以控制量化死区的大小。由于经过DCT变换后,残差值大量处于量化死区,且量化死区的残值值往往对应高频细节信息,在实际应用中,往往需要对量化死区的高频或者大量出现的残差信息特殊处理,所以需要根据实际控制量化死区的大小。但是由于f同时控制着量化偏移量和量化死区,具有耦合性,所以为了解耦合,在JVT-K026中提出一种解耦合的量化器。

  3、变形量化器:引入参数t控制量化死区,公式如下:

    Z = int( (|W| + f + t) / S) * sng(W);

  反量化公式:

    W = (S * |Z| - t )* sng(Z)。

    

  如图:在量化区间(t+f-S, S-t-f)中,量化值是-t;在区间[S-t-f,2S-t-f)中,量化值是S-t。该量化器通过f控制量化值(即:量化值相对于量化区间断点的偏移量),确定量化偏移量满足最优量化器后,通过t控制量化死区的大小。

H.264学习笔记4——变换量化的更多相关文章

  1. H.264学习笔记5——熵编码之CAVLC

    H.264中,4x4的像素块经过变换和量化之后,低频信号集中在左上角,大量高频信号集中在右下角.左边的低频信号相对数值较大,而右下角的大量高频信号都被量化成0.1和-1:变换量化后的残差信息有一定的统 ...

  2. H.264学习笔记1——相关概念

    此处记录学习AVC过程中的一些基本概念,不定时更新. frame:帧,相当于一幅图像,包含一个亮度矩阵和两个色度矩阵. field:场,一帧图像,通过隔行扫描得到奇偶两场,分别称为顶场和底场或奇场和偶 ...

  3. H.264学习笔记3——帧间预测

    帧间预测主要包括运动估计(运动搜索方法.运动估计准则.亚像素插值和运动矢量估计)和运动补偿. 对于H.264,是对16x16的亮度块和8x8的色度块进行帧间预测编码. A.树状结构分块 H.264的宏 ...

  4. H.264学习笔记

    1.帧和场的概念 视频的一场或一帧可用来产生一个编码图像.通常,视频帧可以分成两种类型:连续或隔行视频帧.我们平常看的电视是每秒25帧,即每秒更换25个图像,由于视觉暂留效应,所以人眼不会感到闪烁.每 ...

  5. 02:H.264学习笔记

    H.264组成 1.网络提取层 (Network Abstraction Layer,NAL) 2.视讯编码层 (Video Coding Layer,VCL) a.H.264/AVC影像格式阶层架构 ...

  6. H.264学习笔记之一(层次结构,NAL,SPS)

    一 H.264句法 1.1元素分层结构 H.264编码器输出的Bit流中,每个Bit都隶属于某个句法元素.句法元素被组织成有层次的结构,分别描述各个层次的信息. 图1 H.264分层结构由五层组成,分 ...

  7. H.264学习笔记6——指数哥伦布编码

    一.哥伦布码 哥伦布码就是将编码对象分能成等间隔的若干区间(Group),每个Group有一个索引值:Group Id. >对于Group Id采用二元码编码: >对于Group内的编码对 ...

  8. H.264学习笔记2——帧内预测

    帧内预测:根据经过反量化和反变换(没有进行去块效应)之后的同一条带内的块进行预测. A.4x4亮度块预测: 用到的像素和预测方向如图: a~f是4x4块中要预测的像素值,A~Q是临块中解码后的参考值. ...

  9. H.264编码之DCT变换原理

    DCT变换是一种与FFT变换紧密相连的数学运算,当函数为偶函数是,其傅立叶展开式只有余弦项,因些称为余弦变换,其离散化的过程称为DCT(离散余弦)变换.下面我们就推导下H.264的4x4整数DCT公式 ...

随机推荐

  1. Bash Shell 解析路径获取文件名称和文件夹名

    前言 还是今天再写一个自己主动化打包脚本.用到了从路径名中获取最后的文件名称.这里记录一下实现过程. 当然,最后我也会给出官方的做法.(ps:非常囧,实现完了才发现原来Bash Shell有现成的函数 ...

  2. asp.net MVC 中呈现指定区域下的分部视图

    Html.RenderAction() 可以呈现分部视图. asp.net MVC就是有这种好处,可以将多个子视图无缝合成到一个视图上再输出,那么开发的时候,能够进行模块化开发.看上去同属一个页面上的 ...

  3. GEO,IGSO,MEO,LEO

    GEO(Geosynchronous Eearth Orbit):地球静止轨道卫星 IGSO(Inclined Geosynchronous Satellite Orbit):倾斜轨道同步卫星 地球同 ...

  4. ATan2与ATan的区别

    相比较ATan,ATan2究竟有什么不同?本篇介绍一下ATan2的用法及使用条件. 对于tan(θ) = y / x: θ = ATan(y / x)求出的θ取值范围是[-PI/2, PI/2]. θ ...

  5. [10.27_P3] 简单题 (脑洞)

    Description dzy 手上有一张n 个点m 条边的联通无向图,仙人掌是一张每条边最多在一个简单环内的联通无向图.他想求这个无向图的生成仙人掌中最多有多少条边. 但是dzy 觉得这个问题太简单 ...

  6. bzoj4594: [Shoi2015]零件组装机

    论静态查错的重要性...乱搞题真难调 首先这题看起来就是要分治检验了. 考虑对于区间[l,r],分成[l,p-1]和[p,r]使得这两个区间合并可以得到[l,r],并且要保证后面一个区间较大 设前一个 ...

  7. get the default proxy by Powershell

    https://stackoverflow.com/questions/571429/powershell-web-requests-and-proxies $proxyAddr = (get-ite ...

  8. 使用JSTL 对在页面上对 0,0,1 的分割处理 forTokens

    使用JSTL 对在页面上对 0,0,1 的分割处理 <tr onmouseover="currentcolor=this.style.backgroundColor;this.styl ...

  9. 如何正确使用log4j

      如何正确使用log4j? 关键字: 如何正确使用log4j? Java Web开发的过程中,通过会采用输出log的方式来进行调试,产品上线之后,也通常使用log来记录系统的运行状态.最简单的输出l ...

  10. ['1' for i in range(4)]

    ' for i in range(4)]) 结果: [']