5_4 编码重新总结
1.dct 变换对象是MxN的图像块或残差块,其处理单位为块。
简单说,两边同时乘以一个A然后将原本时域信号投射到频域信号(个人理解就是颜色变换的频率),频域信号中相关性比较小。这个过程完事之后就将原来的每个信号点变成了一系列的系数矩阵。在解码端如果直到A转置的话,将解码得到的系数矩阵重新乘以这个转置A就得到了原来的信号值(残差块或者图像块)。
这样变换完系数矩阵后,主要的信息其实集中在DC系数,也就是最左上角那个,其他的信息由于相关性很强并不是很重要,所以可以某种程度上,丢弃一部分。下一步的量化就是讲系数矩阵中一部分值丢弃掉,通过一定的准则。
下一步的量化就是讲系数矩阵一部分某种程度上的一种丢弃。
这样系数矩阵会有很多的0,在高频区域,但是由于0集中的区域在矩阵中是右下角,高频位置,所以要进行编码前首先要对他们进行一次重排序,将0集中一下。标准中使用的重排序就是zigzag扫描,将4×4,8×8,16×16映射到一个一维的矩阵上,而且此时0的位置在后面,为后面的熵编码提供了方便。
然后就是熵编码,先记录自己的问题。
代码中所说dc和ac是分开编码不懂,但是代码里面确实这么写了,对一个数字编码,然后在对其他15个数字编码,有什么好处吗。
貌似上面重排序之后还有一个游程过程?
先记录下。所谓游程就是对我们变换后的一维数组的另一种表示方式,不是一系列的数字,而是一系列的向量(run-level-last)run表示当前系数前0的个数,level表示当前系数的大小,last表示自己是不是最后一个非0系数。例子
16,0,0,-3,5,6,0,0,0,0,-7
(0,16,0)(2,-3,0)(0,5,0)(0,6,0)(4,-7,1)
熵编码的输入很多。。。。。。。。。。。。。。。。。。。。。。。。这里是以前没有考虑到的
有量化后的传输系数(就是上面说那个向量),
运动矢量(运动补偿块在x方向和y方向上的偏移,具有整数或者半像素精度),
标记点(视频流的同步标志),
头信息(宏块的头信息,帧的头信息,流的头信息)和
辅助信息(又称side信息,视频解码的次要信息)
Cavlc
首先编码非零系数的总数和+/-1序列的个数还有一个nc 它们三个按照以往的统计量信息来查表确定编码的长度
然后编码刚才trailingone的符号,刚才是1的个数,这里还要添上符号
这个是对level完美的讲解
在看一遍cavlc过程(指示对残差来说)
1.首先编码自己本身的非0系数个数和最后面1的个数。同时根据周围的非0个数来查找表,来决定自己的码长。
2.上面编码了最后1的个数,第二部要编码1的符号。
3.编码level,不知道为什么这么做,但是上面那个过程非常明晰
http://www.chinavideo.org/viewthread.php?tid=1057&extra=page%3D3%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D4
4.非0系数前的0的个数
5.0游程
晚上继续总结