VVC(多功能视频编码)中基于块的变换的解释

多功能视频编码 (VVC/H266) 标准于 2020 年 7 月发布,成为高效视频编解码器 (HEVC/H265) 的继任者。测试表明,VVC 可节省高达 30% 的比特率资源,但这会随着算法复杂度的增加而得到回报。一些创新出现在 VVC 的变换部分。

我们对变换了解多少?

变换是一种数据压缩;它的主要目标是将图像或其残差数据映射到变换区域。

良好的数据去相关性、轻微的计算复杂性、可逆性等都是选择最佳变换类型的标志。所有变换方法都属于的两个最流行的变换类别是基于图像的变换和基于块的变换。现在我们对基于块的变换感兴趣。

预测残差块采用基于块的变换编码,变换后得到的变换系数的低频分量集中在块的左上角,高频分量在右下角. 在本文中,我们将观察基于块的变换的新特性:多变换选择 (MTS)、低频不可分离变换 (LFNST) 和子块变换 (SBT)。

多重变换选择 (MTS)

多变换选择 (MTS) 是 VVC 中添加的一种新型正弦/余弦变换。DCT-II 变换是 HEVC 中的唯一变体,但在 VVC 中,感谢 MTS 创建者,添加了一些新的正弦/余弦变换类型:DST-7 和 DCT-8。这些变换类型的定义如下所示:

多重变换选择 (MTS)
图 1. 变换类型

如果我们将 VVC 与 HEVC 进行比较,则 VVC 会更加关注更准确地量化变换矩阵以保存它们的正交性。为了使水平和垂直变换后变换系数的中间值保持在16bit范围内,所有系数均为10bit。

为了提高 MTS 中​​的控制效率,指定了帧内/帧间模式。开启MTS需要在SPS和CU级别开启,同时满足以下条件:

  • CU的宽高都小于等于32,
  • 有一些非归零系数(不仅DC系数是非归零的),
  • 最后一个系数不是DC(CBF设置等于1),
  • 没有那么多系数(最后一个有效系数不在 MTS 归零区域内)。

如果 CU 级别的 MTS 标志等于 0,则对两个方向应用 DCT-II 变换模式。此变换模式的宽度和高度最大值增加到 64。

在这里您可以看到不同块的模式组合:

多重变换选择 (MTS)
图 2. MTS 中​​不同电影/余弦变换类型的模式组合

为了降低大尺寸块 DST-7 和 DCT-8 的计算复杂度,在使用 DST-7 和 DCT-8 的变换块尺寸(宽度或高度,或宽度和height) 达到 32。只保留左上角的 16×16 个低频系数。

在这里,我们可以看到在我们的演示流的每个块中使用了哪些 MTS 模式进行转换。为了可视化它,我们将使用 VQ Analyzer ver。6.0。

多重变换选择 (MTS)
图 3. VQ 分析仪。MTS 比特流可视化

以下是 MTS 的所有可能变体:

多重变换选择 (MTS)
图 4. VQ 分析仪。MTS 可能的变体

MTS 工作示例如图 5 所示。

多重变换选择 (MTS)
图 5. VQ 分析仪。转换可视化

低频不可分离变换 (LFNST)

在 VVC 变换部分实现的另一个新特性是低频不可分离变换 (LFNTS)。LFNST 只能应用于亮度/色度分量的帧内块。

那是什么?它是在前向初级变换和量化(在编码器端)之间以及在解码器端在去量化和反向初级变换之间应用的阶段。LFNST 的主要目标是进一步压缩低频主变换系数之间的冗余,这是来自传统方向帧内预测的变换系数。LFNST 也确实有助于将系数精确地集中在细长矩形的右上角。

低频不可分离变换 (LFNST)

LFNST 由 2 种模式组成:4×4 LFNST(对于宽度/高度 < 8 的块)和 8×8 LFNST(对于宽度/高度 >= 8 的块)。所以让我们考虑一个例子。这是一个块(我们称之为 X):

低频不可分离变换 (LFNST)

这个块可以表示为一个一维向量:

低频不可分离变换 (LFNST)

之后,不可分变换可以计算为: F = T ⋅ X (F 和 X 是向量),其中T是 16×16 变换矩阵,F 是我们计算的变换系数的 16×1 向量。这些系数可以使用光栅扫描顺序重新组合成一个 4×4 块。

LFNST 使用矩阵乘法方法来降低计算复杂度、节省内存空间并存储矩阵系数。如果矩阵维数可以最小化就好了。因此,想法是将 N 维向量映射到 R 维向量,其中 N > R 并且 N/R 是缩减因子。对于 8×8 LFNST,缩减因子为 4,因此变换矩阵为 16×64。但在 VVC 的后期,它被进一步缩小到 16×48。

矩阵降维有助于将存储矩阵的内存使用量从 10Kb 减少到 8Kb,而不会降低性能。

在解码器端,LFNST的逆过程使用了前向变换矩阵的转置矩阵。

低频不可分离变换 (LFNST)

这些 LFNST 变换矩阵T可以表示如下:

  • 8 个不同的 16×16 矩阵,用于 4×4 LFNST(4 lfnstTrSetIdx 和 2 lfnst_idx 的笛卡尔积);
  • 8 个不同的 16×48 矩阵,用于 8×8 LFNST;

所有这些矩阵都预先计算并存储在编码器/解码器端。

要选择最合适的 LFNST 矩阵,您需要知道 lfnstTrSetIdx,它取决于 IntraPredMode 和 lfnst_idx,它在比特流中传输。下面是 lfnstTrSetIdx 对 IntraPredMode 的依赖表:

图 10

但是 LFNST 不能在所有情况下都有效。以下是无法使用 LFNST 时的一些限制:

  1. 块大小大于 64×64 或宽度/高度 CU 大于最大 transform_block_size;
  2. 如果应用 ISP,TU 宽度或高度小于 4;
  3. 块具有 INTER 模式;
  4. 使用变换跳过;
  5. 块 4×4 和 8×8 有超过 8 个第一有效系数;
  6. 第一个子块中有一些系数;
  7. 如果只有一个非零系数(仅 DC);

需要注意的是,LFNST 和 MTS 是连接的:如果启用 LFNST,则只能应用 DCT-II 模式(MTS 索引 = 0)。

图 11
图 12

最后,让我们看看 LFNST 如何在实际块上工作。这里我们使用 VQ Analyzer 6.0 来可视化这个过程。

子块变换 (SBT)

子块变换 (SBT) 是 VVC 中变换的另一个新特性。SBT 的一个显着特点是只有一部分残差块被编码为 CU。SBT 仅用于帧间预测的 CU。假设 SBT 在 CU 级别禁用 (cu_sbt_flag = 0)。在这种情况下,整个残差块根据之前指定的 MTS 模式进行编码。如果在 CU 级别启用 SBT,则只有一部分残差块使用推断的自适应变换进行编码,而另一部分则归零。

SBT模式有以下几种可以指定的模式:

  1. 它可以有垂直或水平分割;
  2. 它可以拆分为 2:2(作为二叉树)或 1:3 / 3:1(作为非对称二叉树);
  3. 它可以选择位置左/上(0)或右/下(1)(取决于分区)。

因此,可以表示 SBT 8 情况(如上面指定的不同模式的笛卡尔乘法)。

需要注意的是,如果分区是 1:3 或 3:1(QUAD 模式),非零残差仅位于较小的区域中。

在这里可以看到 SBT 位置、类型和变换类型的示例:

子块变换 (SBT)

重要的限制是 SBT 不能应用于 CU,它是用组合帧内模式编码的。

这就是我们想要在本文中描述的变换的新特性。希望它会有所帮助,并且您喜欢阅读它。

参考

作者:Kirill 是 ViCueSoft DVK 部门的一名软件工程师。他是负责开发 VVC 随机编码器、比特流数据包生成和技术文档的团队的一员。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论