AVS-P2中的8x8二维整数余弦变换(Integer Cosine Transform, ICT)

为何采用ICT?

基于块的DCT能很大程度上去除图像元素在变换域中的相关性,在图像和视频编码领域得到广泛的应用。但由于DCT存在计算量大以及存在反变换失配,因此AVS Part 2采用的是ICT,其性能接近8x8 DCT,但精确定义到每一位的运算避免了不同反变换之间的失配。ICT具有复杂度低、完全匹配等优点。ICT可用加法和移位直接实现。

何为ICT?

整数余弦变换(Integer Cosine Transform, ICT)源自离散余弦变换,是定点余弦变换的扩展。设一个二维数据块X大小为nxm,如果要对X进行二维整数余弦变换,那么垂直正向整数余弦变换矩阵A大小为nxn,水平正向整数余弦变换矩阵B大小为mxm。

变换过程:

Y=A×X×B

变换矩阵A和B如何确定呢?

一个nxn变换矩阵ICTn包含了n个相同或不同的整数系数,设第k行第0列的系数tk0表示为nk,0≤kn?1,则第i行j列系数tij

tij=nk,当cos(2j+12niπ)=cos(k2nπ),0≤in?1,1≤jn?1

tij=?nk,当cos(2j+12niπ)=?cos(k2nπ),0≤in?1,1≤jn?1

并且要求矩阵中所有的行向量都是正交的。

为何采用8x8块大小?

在基于块的视频编码中,有变换块大小、帧间和帧内图像补偿块大小。在H.264/AVC中,最小的变换以及帧内和帧间补偿块大小都是4x4.块越小,帧间和帧内补偿的精度越高,而且残差越小。但另一方面,块越小,运动矢量和帧内预测模式需要越多的比特数。

实验表明,在高清序列上8x8块大小比4x4要好,而高清视频是AVS Part 2的目标。8x8整数变换的计算量比4x4要大一点,但是从运动补偿、运动估计和去块效应滤波上看,8x8块的复杂度要低很多。综合性能和复杂度,AVS Part 2采用8x8块作为帧内预测、最小的帧间运动搜索块大小、变换和最小的运动补偿单元。

总结

AVS Part 2中的8x8整数变换矩阵,变换性能好,且实现简单。8x8整数变换矩阵是由AVS工作组相关人员经过多次试验测试,综合考虑变换性能和实现复杂度而得到的。在复杂度方面,其变换核中的系数不大,通过对整个变换编码过程进行合理设计后,在解码端的反变换过程中,所有的中间变量以及最终结果都可以保证在16bit内。也就是说整个变换过程能够在16bit的寄存器内完成。



参考书籍:《AVS技术创新报告(2002-2010)》

时间: 2024-07-31 10:06:38

AVS-P2中的8x8二维整数余弦变换(Integer Cosine Transform, ICT)的相关文章

结对开发之返回一个二维整数数组中最大联通子数组的和

一.题目要求 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.解题思路 先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果. 三.程序代码 2 #include<iostream.h> 3 int main(int argc, char* argv[]

返回一个二维整数数组中最大联通子数组的和6

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 #include<ios

返回一个首尾相接的二维整数数组中最大子数组的和

一.题目:返回一个二维整数数组中最大子数组的和. 二.要求: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数组的和的最大值. 三.解题思路: 将两个同样的数组首尾相接合并成一个数组,在用以前求二维数组最大子数组的方法求解 四.源代码: #include<iostream> using namespace std; #include"math

返回一个二维整数数组中最大子数组的和

题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.      二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和.      求所有子数组的和的最大值.要求时间复杂度为O(n). 结对编程要求:两人结对完成编程任务.              一人主要负责程序分析,代码编程.              一人负责代码复审和代码测试计划.              发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照)

返回一个二维整数数组中最大子数组的和(头尾相接)

1.题目. 题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 2.设计思想. 分别求出每一行的最大子矩阵,然后再两行相加,求出最大子矩阵,一直到所有的行相加,求出最大子矩阵.比较其中最大的子矩阵值,找出最大的. 3.代码. #include<iostream> using namespace

返回一个二维整数数组中最大子数组的和2

题目:返回一个二维整数数组中最大子数组的和2 要求:输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 思路: 代码: 截图: 总结:

结对开发之《返回一个二维整数数组中最大子数组的和》

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划.发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照).(截止到周四4月9日24:00) 二.编程思路 我们的思路比较简单,采用的是将

求二维整数数组中最大联通子数组的和

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 1 #include<i

《返回一个二维整数数组中最大子数组的和》

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大 两人结对完成编程任务.一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照).(截止到周四4月21日24:00) 二.设计思路 本次实验设计思路非常简单,就