变化编码的基础知识
定义:变换编码是将以空间域像素形式描述的图像转换至变换域,以变换系数的形式加以表示。
大部分图像都包含较多平坦区域和内容变化缓慢的区域,使得图像能量在空间域的分散转换为变换域的相对集中分布,从而达到空间去冗余的目的。
变换概述
选用DCT变换的原因:DCT形式与输入信号无关并且存在快速实现算法,并且性能接近K-L变换。
- H.264第一次使用了整数DCT
- H.265沿用了整数DCT,进行了不同尺寸的变换形式,还引入了离散正弦变换
- H.266同时采用了DCT和DST,并且采用了多种基函数的变换形式,拓展了变换的尺寸(可分为8种类型,但是DCT-2因其较低的计算复杂度和相对高的编码效率,一直是核心变换技术)
离散余弦变换
下图给出了二维4X4的DCT-2基图像。当k=0,l=0的时候,水平分量和垂直分量的频率都等于10,此时图像平坦,在任何地方上都没有灰度值的变化。右下角表示像素灰度在水平方向和垂直方向发生连续变化。不同类型的DCT,其基图像不同,与原图像越相似,变换性能越好。
如果像素块包含较多细节纹理信息,则较多能量分布在高频区域。
实际上,大多数图像包含更多的低频分量,并且可以利用人眼对图像高频信息相对不敏感的特性,对低频系数进行较为精细的量化和处理,更好的压缩图像。
整数离散余弦变换
余弦函数的使用使DCT过程必须处理浮点数,这样不可避免会带来舍入误差导致编解码失配。并且整型使得DCT处理速度大大提高。
二维DCT 可以分解为两个一维DCT,将变换矩阵整数化,同时为了保持正交性,对整数化后的元素进行微调。同时乘以修正系数,防止值的扩大。乘法操作在量化中实现。
- VVC中使用了8、16、32、64这四种DCT-2
- 4、8、16、32这四种DCT-8
蝶形算法
哈达玛变换
H.264种规定了哈达玛变换,与离散余弦变换相比,哈达玛变换仅包含加法运算,可使用递归形式快速实现,并且正反变换具有相同的形式,算法复杂度低,且容易实现。
但自H.265起,标准不在使用该变换,但其在图像编码中有其他的应用,常用于计算残差信号的SATD,指将残差信号进行哈达玛变换后,再求各元素的绝对值之和。根据实验,发现残差的SATD与其经过DCT后的系数的绝对值之和十分的接近,说明SATD能在一定程度上反映残差再频域中的大小。因此被广泛使用在快速模式的选择上。
VVC中的变换编码
VVC摒弃了独立于编码单元CU的变换但与TU,即TU与CU一致,除非CU尺寸大于最大变换块尺寸。并且支持MxN的变换块。
采用的新技术
- 多核选择MTS,4种变换核的组合,以适应图像的不同残差特性
- 子块变换SBT,只针对CU的子块进行变换和后续处理,其他部分残差信号直接设置为0
- 色度残差联合编码JCCR,针对两个色度分量进行旋转变换处理,去除局部性
- 低频不可分变换LFNST,采用特定的变换矩阵对变换系数进行二次变换
主变换
多核变换选择
收预测模式的影响,预测残差会有不同的特性。通常情况下,帧内残差随着与参考点距离的增大而增大,越接近CU边缘越大。用不同的变换核处理不同的残差。
多核变换选择引入了4种变换核组合,与传统DCT-2一起作为主变换的候选,以适应不同内容特性。
高频调零
将变换后的部分高频系数设置为0,仅保留低频系数。
子块变换
当同一CU包含不同内容的时候哦,运动补偿不同,包含的残差信息不同。所以允许只对部分区域的预测残差进行变换。将CU划分为两个TU,只对其中一个进行变换、量化,另一个预测残差强制设置为0。总共有8种SBT模式。
色度残差联合编码
在传统变换之前,先对CB\CR分量使用分量间变换技术,对相同位置的两个色度分量进行变换,去除色度分量间的相关性。旋转变换。
二次变换
二次变换只针对帧内模式,并且主变换为DCT-2的情形,只对主变换系数的低频分量进行不可分变换。因为随着预测模式的变化,尤其是使用方向预测的时候,预测残差具有方向性,变换后的低频分量依旧具有
H.266引入了一种低频不可分变换LFNST技术。
- 不可分变换
- 只处理主变换系数的低频部分,剩余主变换系数被置0
- 为了降低计算复杂度、减少存储变换矩阵所需要的空间,采用了简化不可分变换的方法RT,将一个N维向量映射到不同空间的R维向量上
- 变换核是通过离线训练的方式得到的。因为不同的预测模式有不同的变换集,所以需要对35个帧内预测模式进行训练。最终采用了4个变换集,每个包含2个变换核的方案。
VVC变换编码的标准设计与相关参数
主变换的标准实现
多核变换选择
多核变换选择MTS分为隐式MTS和显式MTS,区别在于隐式MTS根据固定规则判断确定MTS变换核。
- 显式MTS
sps层上,sps_mts_enabled_flag表示是否允许使用MTS
sps_explicit_mts_intra_enabled_flag帧内显式MTS
sps_explicit_mts_inter_enabled_flag帧间显式MTS
- 隐式MTS
满足下列3个条件种任意一个就会启用隐式MTS
当前CU的ISP为水平划分或垂直划分
当前CU使用了SBT,并且CU的宽和高最大值不超过32
帧内显示MTS被禁用,CU预测模式为帧内预测模式,不启用低频不可分变换,且不启用帧内MIP。
启用隐式MTS的时候,使用的变换核也按照一定规则选取。
启用显示MTS,CU层的mts_idx标识MTS所选最优变换核。
相关语法元素
sps_transform_skip_enabled_flag是否启用变换跳过模式
sps_log2_transform_skip_max_size_minus2变换跳过模式的变换块最大尺寸为以2为底的对数值减2,取值范围0-3
sps_max_luma_transform_size_64_flag亮度块最大变换尺寸式64还是32
transform_skip_flag当前变换块是否启用变换跳过模式
子块变换
sps_sbt_enabled_flag子块变换SBT启用标识
CU层的cu_sbt_flag标识当前CU是否进行SBT
子块划分具有垂直划分(SBT-V)和水平划分(SBT-H)两种方式。有1:2、1:3、2:2的划分。划分后的TU有两种位置,即position0(左块和上块)和position1(右块和下块)。
2:2的划分宽度要大于等于8,1:3的CU要大于等于16。连读块的SBT变换核由子块划分方式和所选位置决定。
相关语法元素
cu_sbt_quad_flag标识当前子块的划分方式,1表示1:3划分,0表示2:2划分
cu_sbt_pos_flag标识当前选择的子块位置,1表示第2个子块,0表示第一个子块
cu_sbt_horizontal_flag当前子块划分当时,1表示水平划分,0表示垂直划分
色度残差联合编码
sps_joint_cbcr_enabled_flag表示视频序列是否启用色度残差俩呢编码JCCR。帧内CU的tu_cb_coded_flag\tu_cr_coded_flag至少一个为1,如果都为1,传输tu_joint_cbcr_residual_flag。
VVC支持6种旋转变换,用m来定义6种角度模式。旋转角度的正负由ph_joint_cbcr_sign_flag表示。
二次变换的标准实现
VVC支持8x8\4x4两种尺寸的LFNST
- 使用哪种尺寸的LFNST由TU尺寸隐式判断
- 变换集的选择由帧内预测模式隐式判断
- 变换核的选择由显式信号1fnst_idx决定,标识是否使用LFNST及使用时的变换核索引
选择流程如下
帧内预测模式与变换集一一对应,给出索引PredModeIntra标志帧内预测模式,取值为【-14,80】时的对应变换集。如果包含宽角度在内,为【-14,83】。
在sps层上,sps_1fnst_enabled_flag标识是否使用LFNST,1表示启用。