VVC标准对应的参考软件平台是VTM(VVC Test Model)
1.高压缩性能,定义一套视频编码技术,其压缩性能要远优于以往的同类标准。
2.宽应用领域,能够有效地用于比先前标准更广阔的范围。
图像分块、预测、变换、量化、熵编码、环路滤波
如图1所示,VVC在编码原理和基本结构方面没有突破,仍沿用从H.261就开始的基于块的混合视频编码框架,即预测加变换的分块编码方式;VVC在编码细节上和HEVC很接近,也包含帧内预测、帧间预测、运动估计与补偿、正交变换、量化、熵编码和环路滤波等模块。但是,和HEVC相比较,VVC几乎在每一个编码环节上都采取了一项或多项改进措施,尽管每一项措施的效率提高并不显著,然而诸多措施的总体效果却使其编码效率比HEVC提高了一倍。当然,VVC付出的代价就是编码复杂度也比HEVC提高了好几倍。
VVC与HEVC一样,为了应对不同应用场合,设立了3种编码结构,即全帧内(All Intra)编码、低延迟(Low Delay)编码和随机接入(Random Access)编码。在AI编码中,每一帧图像都是按帧内方式进行空间域预测编码,不使用时间参考帧。在LD编码中,只有第一帧图像按照帧内方式进行编码,并成为即时解码更新帧,随后的各帧都作为普通的P帧和B帧进行编码,这主要是为交互式实时通信设计的。在RA编码中,主要是分层B帧结构帧,周期性地插入一个随机访问帧,成为编码视频流中的随机访问点。这些随机访问点可以独立解码,不需要参考码流前面以及解码的图像帧。
VVC在编码时将每一帧图像都划分为相同尺寸、紧密排列的编码树单元(CTU),根据编码图像局部特征的不同,编码树单元又可以灵活地划分为更小的编码单元(CU)。
和HEVC基本相同,VVC允许将图像帧划分为若干条,条由相邻的整数个CTU组成。VVC支持两种排列类型的Slice,顺序扫描Slice模式和矩形Slice模式。
VVC中也允许用水平和垂直的若干条边界将图像帧划分为多个矩形区域,每个区域就是一个片(Tile),每个片包含整数个CTU。VVC的Slice和Tile大体上和HEVC一致。
和HEVC不同,VVC还新增了矩形的子图像划分。一个子图像可包含一个或多个Slices,这些Slices共同覆盖图像的一个矩形区域。相应地,每个子图像的边界总是Slice的边界。图2是包含Suppicture(子图像)的划分一例,一帧图像被划分为18个片(Tiles),其中12个较大的片Tiles在左边,每个Tile覆盖一个4*4 CTU的Slice;其余的6个较小的Tiles在右边,每个覆盖2个2*2 CTU的Slices,这样总共形成24个Slices和24个子图像(每个Slice就是一个子图像)。
在VVC中为了适应4K、8K等超高清视频编码的需要,将CTU的最大尺寸扩大到128*128,最小尺寸还是4*4。CTU可进一步分为若干编码单元(CU),最大的CU可等同于CTU,最小的CU为4*4。在HEVC中每个CU又可以划分为预测单元(PU)和变换单元(TU),但在VVC中将不再区分CU、PU、和TU,大多数情况下三者统一为CU。
不同于HEVC,VVC的CTU除了4叉树划分方式外,还引进了多类型树(MTT)划分,包括2叉树和3叉树。一个CTU首先按4叉树方式进行一次划分,4叉树的每个叶子节点既可以继续4叉树划分,也可以进一步按照多类型树方式进行划分:水平或垂直2叉树划分,水平或垂直3叉树划分,如图3所示。2叉树和3叉树划分可以交替并嵌套进行。但是需要注意,一旦采用了2叉树或3叉树划分,就不再允许进行4叉树划分。
图4给出了一个64*64的CTU的4叉树和嵌套多类型树划分的示例,这种划分方式可以根据图像内容自适应进行,提升了划分灵活性。
前面介绍的是亮度CTU的MTT划分,对于图像的色度部分,考虑到同一位置的亮度和色度信号可能具有不同的特性,因而在VVC中,I帧CTU的亮度分量和色度分量的划分方式可以不同,这时亮度和色度分量各使用一个编码树表示,对于P帧和B帧,则同一个CTU中的亮度和色度必须由相同的划分。由于色度信号的亚取样影响,色度信号在单独划分时禁止出现2*2、2*4或4*2尺寸的色度块。
至此可以看到,图像划分从单一、固定划分不断朝着多样、灵活的划分结构发展。
对于输入视频和重建视频,VVC支持ITU-R BT.601建议规定的4:4:4、4:2:2和4:2:0图像亮度(Y)和色度(Cb和Cr)信号的取样结构;支持的ITU-R BT.2100的宽色彩空间;最少支持16级高动态范围(HDR)视频,最高亮度可达1000/4000/10000尼特。
像素的最大比特数表示图像灰度分辨率,又称为比特深度,其值通常为8比特,256个等级。这对于人眼的观赏已经足够了,但是对于编码处理或某些特殊应用场合,有时需要更高的比特深度。为此,VVC支持8至16比特深度的输入和输出视频,最常见是10比特深度。
VVC支持视频的0~120Hz可变帧率,以适应不同视频应用的需求。支持环绕立体视频或多角度视频编码,如360°、180°等全景视频。
至于尚存的隔行扫描视频,VVC和HEVC一样,不再提供专门的工具,只是将隔行视频的一帧看作两个独立的场,对各个场数据分别进行编码,简化了编码器的实现。
为了使应用更加灵活,和HEVC一样,VVC中定义了编码的不同档次、水平和等级。
“档次”规定了视频编码采用什么编码工具和编码算法。VVC档次规定了一套用于产生不同用途码流的编码工具或算法,共有4个主档次,即常规10比特像素深度的Main 10,支持静止图像的Main 10 Still Picture,支持全取样的Main 10 4:4:4,支持全取样静止图像的Main 10 4:4:4 Still Picture。2个多层主档次,Multilayer Main 10和 Multilayer Main 10 4:4:4。档次的主要技术指标包括:像素的比特深度、色度采样方式和解码缓存的图像容量等。
“水平”规定了某一档次、等级的编码参数,如采样率、码率、压缩率、缓冲区容量等。VVC设置了1.0,2.0,2.1,3.0,3.1,4.0,4.1,5.0,5.1,5.2,6.0,6.1,6.2共13个水平,一个水平实际上就是一套对编码比特流的一系列编码参数的限制,如视频采样格式、图像分辨率(如从176*144到8192*4320)、最大输出码率等。如果说一个解码器具备解某一水平码流的能力,则意味着该解码器具有解码等于和低于这一水平所有码流的能力。
“等级”规定了每一水平的比特流的高低。对同一水平,按照最大码率金额缓存容量要求的不同,VVC设置了两个等级,高等级和主等级。主等级可用于大多数场合,要求码率较低;高等级可用于有特殊要求的场合,包括5.0到6.2的6个水平,允许码率较高。
VVC的帧内预测技术的原理和HEVC类似,采用基于块的多方向帧内预测方式来消除图像的空间相关性,但是比HEVC预测方向更细、更灵活。如图5所示,VVC为亮度预测块定义了65种不同的基本帧内预测方向,相当于在HEVC帧内预测33个方向的每两个方向中间增加了一个方向,连同平面(Planar)和直流(DC)模式,共67种预测模式。VVC亮度帧内预测单元的尺寸从4*4到64*64,其中包含矩形单元。考虑到方便矩形帧内与预测块的宽角度模式,VVC的帧内预测编码总共有93个方向。
DC模式的编码块所有像素的预测值都等于其左侧和上方已编码的所有参考像素的平均值。Planar模式的预测值由待编码的亮度块的水平和垂直两个方向上的参考像素的线性内插产生,它们一般适用于图像的平坦区域。
VVC的帧内子块划分(ISP)就是根据编码块的尺寸将亮度预测块在水平或垂直方向上分为2个或4个子块。VVC规定每个帧内预测块至少要有16个样点,因此4*4块不再划分。允许ISP划分的最小尺寸为4*8或8*4,可划分为2个子块,如图6(a)所示;如果大于4*8或8*4则划分为4个子块,如图6(b)所示。
HEVC色度块采用依附亮度块的简化预测,共有5种模式,即Planar、DC、水平方向、垂直方向和派生模式(DM),DM直接复制对应亮度块的预测模式。VVC色度分量除了沿用这5种预测模式外,还考虑到亮度和色度之间的相关性,对色度分量增加了一种跨分量线性模型(CCLM)预测模式。在CCLM中,色度样值C(i,j)从同一个编码单元对应的已重建的亮度样值L'(i,j)通过线性模型预测得到,即C(i,j)=α*L'(i,j)+β,α和β为CCLM参数,可利用当前块左侧和上方相邻的像素通过计算得到。此外,还有单独使用左侧相邻像素预测的LM_L模式;或者上方相邻像素预测的LM_A模式。这样,色度分量在5种传统帧内预测模式的基础上,新增了CCLM、LM_A和LM_L三种模式,共有8种预测模式。
传统的帧内预测利用和当前块相邻的行和列的像素作为参考像素。如果当前块和参考行在内容上不连续,可能会导致较大的预测误差,为此VVC新增了多行参考(MRL)帧内预测技术,将参考行从相邻参考行0扩展为参考行0、参考行1和参考行3.实际预测时从3行中选择预测误差最小的参考行作为最终预测使用的最佳参考行,如图7所示。图7中A和F区域的已重建像素与当前块距离较远,有可能引入较大的误差,因此A区域的像素由B区域的距离最近的像素填充,F区域的像素由E区域距离最近的像素填充。
帧内预测时,编码器需要从多种预测模式中选择一种最佳模式使得编码效率最优。如果直接对预测模式信息进行编码,需要较多的编码比特。考虑到相邻块之间的帧内预测模式也存在空间相关性,即当前块的预测模式很有可能与相邻块的预测模式一致,因此可以从相邻块的模式来预测当前块最可能的模式(MPM)。当前块的预测模式被划分为MPM和其余模式,然后对这两类模式分别编码,以提升编码效率。
视频压缩中的变换是将空间域的图像信号转换到频率域,大幅度解除了图像信号之间的相关性,为后续的量化压缩创造条件。因此,选择何种变换函数和采用什么量化方法就显得格外重要。
在HEVC中,对帧内预测生成的4*4亮度残差块采用离散正弦变换(DST)方式,对于其他的残差块,则使用离散余弦变换方式(DCT)。通过残差4叉树(RQT)对变换块系数进行排序和量化。
与HEVC不同,VVC为了提高压缩性能,在变换环节提供了更多可供选择的变换函数和不可分离的二次变换,在量化环节采用了基于率失真优化的量化方式和简洁的系数排序方式。
VVC将最大变换块尺寸扩展到64*64,在HEVC的DCT-2变换基础上,采用了多变换选择(MTS)技术,增加了DST-7和DCT-8两种变换函数,形成一组候选变换函数集,成为VVC中的主变换
对于长或宽等于64的大尺寸变换块,直接舍弃高频变换系数,仅保留低频变换系数。例如,对于长宽为M*N的块,若M等于64,只保留左边32列系数,若N等于64,只保留上方32行系数。
针对帧间预测的CU,VVC还采用了子块变换(SBT)技术。在SBT模式下,只需要对残差块的一个子部分进行变换处理,从而降低变换系数的高频分量,减少标记残差块是否为0的编码代价,提高压缩性能。
对不同的预测方式,编码器可以根据哪一种变换的编码效率最高来选择不同的变换方式。
由于不可分离变换比可分离变换具有更好的去相关效果,VVC采用了基于归零的不可分离二次变化(NSST)技术。所谓的二次变化,就是对主变换系数进行第二次变换,将信号从一个变换域转换至另外一个变换域后再进行量化、熵编码等操作,其目的是进一步提高变换效率。AVC和HEVC都提供了自己的二次变化技术。VVC采用了NSST技术对高频系数采用归零方案,也就是仅保留二次变化的低频系数,高频系数假设为0,NSST也因此别称为低频不可分离二次变化(LFNST)。LFNST仅用于帧内编码的块,其变换集的选择与帧内预测模式有关。以16*16预测残差块为例,仅对左上角的3个4*4子块所包含的变换系数(拉成48*1的数据条)进行二次变换,因此一个LFNST变换核的大小为16*48,变换的结果为16个系数。
普通量化是以量化失真最小为设计目标,但在视频编码中,编码比特率的高低也是非常重要的判断指标,两者并不完全一致。因此视频编码中的量化器设计需要权衡失真与比特率。对于一个变换系数,给出多个可选的量化值,用率失真优化准则选出最优的量化值,这就是率失真优化量化(PDOQ)方法。VVC在RDOQ量化时,需遍历编码块内系数。如果当前CU每一个4*4系数组(CG)量化后是全零CG,那么只需发送全零标志;否则,需要传送CG中量化后的系数。
和HEVC一样,VVC也是标量量化方式,但最大量化参数(QP)从51扩大为63。VVC采用了一种依赖性标量量化(DSQ)方法,它定义了两个不同重建水平的标量量化器,系数的量化按照一定的规则自适应地在这两个标量量化器间转换。其本质在于,在同一个量化间隔中有两个输出量化值供选择,可以降低量化误差。
和HEVC相同,VVC也支持默认量化矩阵和用户自定义量化矩阵。使用量化矩阵的目的是对不同位置的系数采用不同的量化步长,以适应人眼的视觉特性,比如人眼对高频分量不敏感,就可以对高频系数使用更大的量化步长。
在视频编码中,一般需要将变换块中量化后的系数通过特定的扫描方式形成一维数据,然后对它进行熵编码。VVC将W*H的变换块量化后的变换系数值排列成一个W*H的矩阵。为了保证对所有尺寸的块统一进行扫描处理,也为了增加变换块的编码效率,考虑到编码块中信号能力一般集中在水平或垂直方向的低频率处,因此将变换块的系数分为若干系数组(CG),对每个CG及CG内系数使用多扫描路径以统一的方式进行编码。由于VVC也支持宽度和高度小于4的块,CG的形状取决于变换块尺寸。对于1*N或N*1(N≥16)的CU,CG的尺寸为1*16或16*1;对于2*N或N*2(N≥8)的CU,CG的尺寸为2*8或8*2;其他CU的CG尺寸都是4*4。
CG的编码顺序为图8所示的反向对角扫描顺序,和CG的尺寸无关。图8中每个小方块表示一个CG。系数块的CG从右下到左上的对角顺序处理,这里每个对角方向都是朝左下方向进行。为了限制解码器复杂度的最差情况,VVC将大变换块的高频系数强制置零。非零的量化指数只能表示在变换块的max(W,32)*max(H,32)左上角区域,而这一区域以外的CG就无需编码,从而也无需扫描,如图8(d)所示。CG内部系数的扫描顺序由相同的对角扫描方式来定义,图8(b)中的扫描也可表示4*4CG中的系数值的扫描顺序。
输入视频在预测、变换和量化以后,还需对量化、扫描后的变换系数进行熵编码,以获得进一步的信息压缩。在熵编码中常见的有较为简单的变长编码(如Huffman编码)和效率较高的算术编码两大类。如果将编码方式和编码的内容联系起来,则可获得更高的编码效率,这就是常见的上下文自适应变长编码(CAVLC)和上下文自适应二进制算术编码(CABAC)。这两类熵编码都是高效、无损的压缩方法。其中CABAC要胜过CAVLC一筹,尤其是在高码率的情况下更是如此。VVC和HEVC一样,熵编码采用的是CABAC,但在HEVC基础上有所改进。
由于上下文自适应二进制算术编码(CABAC)较普通的变长编码性能优越,在AVC标准中是可选的两种熵编码方法之一,而在HEVC和VVC中则成为唯一的熵编码方法。尽管和HEVC采用同样的编码引擎,VVC为“常规编码模式”设计了一种新的灵活、高效的编码引擎。编码引擎由两部分组成:概率估计和码字匹配。
概率估计的目的在于确定下一个二进制符号其值为“1”的概率。这种估计是基于使用相同上下文的已编码符号值的历史,利用指数衰减窗口进行的。HEVC的编码引擎采用128状态单一有限状态机作为指数平滑估计器,虽然VVC也采用了这样的估计器,但有很大的不同:为了改进压缩性能,VVC为每个上下文维持两个估计器,每个估计器有自己的衰减系数,实际用于编码的概率是两个估计器的平均值。在概率估计中,VVC不使用状态机,而是由回归函数计算导出。实际上主要的差别在于VVC为每个上下文导出的值表示一个实际概率(线性空间),而在HEVC中,它表示状态机的一种状态(对数空间)。
至于码字匹配,当前的间隔被分为两个子间隔,每个子间隔对应二进制符号的值,0或1.每个子间隔的范围由当前间隔范围R和相对应的概率估计值相乘获得。在HEVC中,使用查表来近似这个乘法运算,以确定和最小概率符号(LPS)相关的子间隔范围R(LPS)。而在VVC中,就直接使用乘法获得LPS的子间隔范围。一旦R(LPS)确定后,HEVC和VVC的编码引擎就以相同的方式工作了。
HEVC的帧间预测有3种模式:跳过(Skip)模式,无需预测残差运动矢量从相邻块运动矢量得到,不需要编码运动参数;合并(Merge)模式,需要预测残差,当前块的运动参数由相邻块的运动参数得到,只需传递Merge模式的候选编号;普通帧间(Inter)模式,需预测残差,需进行运动估计获得运动矢量(MV),并利用相邻块得到运动矢量预测(MVP),MV和MVP相减得到运动矢量差(MVD),需参考图像索引。VVC在HEVC 3种预测模式的基础上,对帧间预测工具作了多方面的扩展和新增。
(1)扩展的Merge预测(EMP)
VVC采用了扩展Merge预测(EMP)模式:增加了候选列表长度,由HEVC的5增加到现在的6;在列表构建过程中,首先检查空域各个邻编码块运动矢量预测(MVP),接着检查时域候选块,检查过程和顺序都和HEVC相同。
如果候选列表没有被填满,VVC增加了一种填充候选的基于历史运动矢量预测(HMVP)方法,维护并更新一个HMVP列表,当编码完一个块后,将该块的运动参数作为一个新的候选添加到HMVP列表的末尾,按照先进先出的规则将最前面的候选用作填充。
添加完HMVP候选后,将列表中的前4个候选MV,两两进行平均,再将平均值后有效的MV按一定顺序添加进Merge候选列表中。如果依然没有填满候选列表,则使用0运动矢量填满。这样候选列表的顺序为:空间域相邻块候选,时间域候选,历史候选,空间平均值候选,0运动矢量。
当候选列表构造好了之后,编码器就要对候选列表中的每一个候选进行率失真代价的计算,以得到一个性能最优的候选。
(2)带运动矢量差的Merge模式(MMVD)
在HEVC中的Merge模式中,Merge列表中的MVP直接用于当前CU的预测,VVC的Merge模式和Skip模式中可引入带有MVD的Merge模式(MMVD),MVP与MVD相加,得到真实的运动矢量MV,用于当前CU的帧间预测,是否使用MMVD的标志需要传至解码端。采用MMVD模式时,选择普通Merge列表中的前两个候选MV作为初始运动矢量,然后对该MV进行扩展,一个MV要在4个方向以8种步长进行扩展,两个MV就有4*8*2=64种新的MV,对所有64个扩展MV进行率失真代价比较,从中选择出最优的一个作为最终的MV传递至解码端。
5.2.1 带有CU权重的双向预测(BCW)
对于一般双向预测块,最终的预测值Pbi由两侧的两个运动矢量预测值P0和P1平均得到:即Pbi = (P0+P1+1)/2。实际应用中同一内容随着时间变化有可能会产生光线强弱变化或阴影等现象,导致不同帧之间场景很相似,但是明暗差别较大,而且局部内容也会产生类似的光线变化,采用简单的平均方式会使得帧间预测的误差较大。为此,VVC提出了一种带有CU权重的双向预测(BCW)方法,它不是简单地求均值,而是在CU层面对两个预测值进行加权求和:
Pbi=((8-w)*P0+w*P1+4)/8 。加权系数w的范围为{-2,3,4,5,10},低延时应用中的权重可以从这5个系数中选取,其他应用则从{3,4,5}这3个系数中选取。
5.2.2 双向光流(BDOF)
基于分块的帧间双向预测是以块为单位来描述运动的,但往往在最小划分块内还有可能存在一些不一致运动的像素,现有帧间预测无法对这些像素实现最佳预测。为此,VVC对亮度分量采用双向光流(BDOF)技术,将光流的概念引入到双向预测当中。在传统双向预测运动补偿时,可用BDOF得到运动的修正量,实现像素级别的运动补偿,而且不增加额外的划分和运动矢量编码,从而提高编码效率。
5.2.3 仿射运动补偿预测(AMCP)
以往的标准在进行运动补偿时只考虑了平移运动,而在实际场景中往往存在各种运动,例如缩放、旋转等不规则运动。VVC中增加了基于块的仿射变换运动补偿预测(AMCP)。如图9所示,一个块的仿射运动向量可由2个控制点(4个参数)或3个控制点(6个参数)生成。
VVC考虑到计算复杂度,不进行以像素为单位的仿射运动估计,而以4*4块为单位进行运动补偿。也就是说,从4*4块单位来看,虽然与普通的运动补偿相同,但从整体CU来看,却是基于块的仿射的运动补偿。AMCP首先将块CU划分为4*4的亮度子块,然后对每个子块由仿射向量计算其中心像素的运动向量。然后,根据运动向量进行运动补偿插值滤波得到每个子块的预测值。对于色度分量同样是划分4*4的子块,其运动向量等于与其同位的4个4*4的亮度子块运动向量的平均值。和传统的帧间运动向量预测方式一样,仿射运动向量也有两种预测方式:仿射Merge模式和仿射AMVP模式。
5.2.4 几何划分模式(GPM)
在VVC中,当CU尺寸为8*8到64*64(除8*64和64*8)时,可根据需要采用几何划分模式(GPM),用自己块内的一直线将该CU分割成两个部分。GPM模式支持64种不同的划分,划分直线的角度和偏移参数需编码传送。每个部分都是一种Merge模式,并且只允许单向预测,因而只须一个单向的预测MV(运动矢量)以及对应的参考帧索引。两个部分可根据各自的MV,运动补偿出各自的预测值。这样,一个CU的两部分的预测计算量相当于一个双向预测的CU。在几何划分预测的CU中,在划分线周围的像素通过自适应地权值加权融合出新的预测值,分区其余地方的预测值不变,最终得到整个CU的预测值。
(1)基于子块的时域运动矢量预测(SbTMVP)
与HEVC中时域运动矢量预测(TMVP)类似,VVC中采用了基于子块的时域运动矢量预测(SbTMVP)技术:通过时域相邻运动信息对当前子块的运动矢量进行预测。当CU的宽和高都大于8时,才可以使用Sbtmvp模式,子块大小固定为8*8.与TMVP不同的是,SbTMVP基于子块进行处理,而且要利用空间相邻块的运动矢量信息。
SbTMVP首先检查左下角相邻块是否使用同位图像作为参考图像得到运动矢量,如果是,该运动矢量作为当前块的运动矢量位移(Shift),否则将运动矢量位移设置为(0,0)。然后,利用得到的运动位移(当前块的坐标加上运动位移)从同位图像中获得子块的运动信息,当前CU的每一个子块的运动信息都可通过同位图像对应子块的运动信息导出。、
(2)自适应运动矢量精度(AMVR)
在HEVC中亮度运动矢量差(MVD)仅使用1/4像素和整数像素精度。而在VVC中,采用自适应运动矢量精度(AMVR)方式,可以使用3种系数精度进行编码,分别是1/4像素精度、整数像素精度和4倍像素精度。编码器可以在3种精度中进行自由选择,并决定出一个性能最优的精度进行最终编码,使用一个标识符进行标记。这样可以在不同的图像中,自由地选择性能最佳的运动矢量差的精度。
(3)对称运动矢量差(SMVD)
为了进一步降低编码码率,VVC对双向预测中mvd 0和mvd 1编码时采用了对称运动矢量差(SMVD)编码方式,编码mvd 0,设置mvd 1为-mvd 0,如图10所示。
最终两个运动矢量mv 0和mv 1分别为
这样,使用SMVD模式时,传输双向预测信息时不需要传list0和list1中参考图像的索引和list1的MVD,这些运动信息可以在解码端生成。
(4)解码端运动矢量修正(DMVR)
为了提高Merge模式的双向预测的准确率,VVC提供了一种解码端运动矢量修正(DMVR)技术。在解码端,根据Merge候选列表得到当前块在前向参考列表L0和后向参考列表L1中对应的运动矢量MV0和MV1,然后计算得到对应的两个预测块。在MV0和MV1周围搜索,计算若干新的预测块,将最小的SAD(绝对误差和)对应的运动矢量MV0'和MV1'作为修正后的运动矢量,并用其计算得到双向预测信号。搜索包括整像素搜索阶段和分像素搜索阶段。该过程在解码端实现,因此不需要消耗额外的编码比特。大体来说,就是在解码得到的MV周围,找到更好的MV取代之。
在以前的编码标准中,一个CU在预测时,帧内预测和帧间预测二者只能取其一。而VVC中提出了一种联合帧间、帧内预测(CIIP)技术,对一个CU同时使用帧内预测和帧间预测得出两个预测块,最终的预测块由这两个预测块加权得到。CIIP要求CU为Merge模式编码,且CU包含至少64个亮度采样,宽度和高度均小于128个亮度采样。
在CIIP中,帧间预测信号Pinter采用普通Merge模式的帧间预测过程得到,帧内预测信号Pintra采用普通Planar模式帧内预测得到。最后预测的结果P(CIIP)由两者加权平均得到,加权值wt由当前块左边和上边相邻块的编码模式决定
环路滤波位于编码器预测环路中,是预测环路的一部分,属于环内处理,而不是环外的后处理。环路滤波的目的就是消除编码过程中预测、变换和量化等环节引入的失真。由于滤波是在预测环路内进行的,减少了失真,存储后为运动补偿预测提供了较高质量的参考帧。VVC除了采用类似HEVC的去方块滤波(DBF)和样值自适应偏移(SAO)环路滤波工具外,为了进一步提升重建图像质量,减少重建图像与原图像之间的差异,还采用了自适应环路滤波(ALF)对不同块采用不同的滤波系数,使得重建图像和原始图像的误差最小。
方块效应是由于采用图像分块压缩方法所形成的一种图像失真,尤其在块的边界处更为显眼。为了消除这类失真,可以在方块的边界按照“边界强度”进行自适应低通滤波,即去方块滤波(DBF)来减轻编码单元边界的块效应。HEVC为了减少复杂性,仅定义了3个边界强度,而没有对4*4块边界滤波,仅滤波边界附近的像素。
VVC扩展和改进了HEVC的去方块滤波:在滤波强度决策上不再只取决于QP,还增加了对重建图像的平均亮度的依赖。因为VVC最大量化参数从51扩展为63,视频量化精度从8比特扩展为10比特,因此对滤波参数表同步进行了扩展。在滤波边界上,VVC增加了对4*4边界的处理。在滤波强度上,考虑到大尺寸的编码块,对亮度块边界引入更大强度的双线性滤波,对色度块边界也新增了增强滤波模式。此外,考虑到VVC的帧内和帧间预测的需要,增加了子块划分,因此增加了对子块边界的滤波。
6.2 样值自适应偏移
在编码图像灰度比较陡峭的区域,容易丢失图像高频分量,从而引起振铃现象。VVC和HEVC一样,在环路滤波中采用了样值自适应偏移(SAO)技术,对要重建的图像逐像素进行滤波,以降低振铃效应。SAO先安装像素的灰度值或边缘的性质,将整个像素分为不同类型,然后按照不同的类型为每个像素值加上一个简单的偏移值,达到减少失真的目的。加偏移值由两种可选模式,带偏移(BO)和边缘偏移(EO),在码流中需给出模式选择的标识。
BO模式将像素值从0到最大值分为32个相等的间隔——“带(bands)”。例如,对10比特而言,最大值是1023,则此时的带的带宽就是1024/32=32,每个带所包含的像素值都比较相近。如果某CU的亮度值分布在4个相邻的带中间,说明这原本是一个比较平坦的图像区域,这样的区域人为失真容易出现,则需对这些像素值施加偏移量(可正可负),使像素值的分布趋向更集中。当然这个偏移量也要作为带偏移传输到解码端。
EO模式使用一种3像素结构来对所处理的像素进行分类。以处理像素为中心再加上最近邻的2个像素,形成45°、垂直、水平和135°四种“3像素结构”,如图11所示。
按照3像素值得不同分布,该像素可被分为峰值像素(如果其值大于相邻的2个像素),谷值像素(如果其值小于相邻的2个像素),边缘像素(如果其值等于任何一个相邻像素)和其他像素,共4类。对4类不同的像素所加的偏移值也不同。
除了块效应和振铃效应,图像中所有像素在编码前后都有可能引入误差,VVC在DBF和SAO之后又新增了基于块的自适应环路滤波(ALF),对所有像素进行滤波修正,以降低编码图像的失真。ALF采用的是简化的中心对称的二维维纳滤波器,滤波器中心的位置对准的是当前滤波的像素,目标是使得原始图像和重建后图像之间的均方差最小。亮度分量和色度分量分别采用图12中7*7和5*5大小的菱形滤波器。VVC中采用的是基于块的ALF,将每一帧图像划分为4*4大小的块,然后按照一定的规则对所有块进行分类并选取不同的滤波系数。
对于亮度分量4*4块,VVC定义了最多25组滤波系数,根据4*4小块以及周围像素的梯度信息决定采用哪一组滤波系数,该块内所有像素均属于同一组。对于色度分量,Cb,Cr各自只定义一组系数。3个分量独立进行率失真优化、系数推导以及最终的滤波。