最大宏块类型与编码块模式联合编/解码的方法
技术领域
本发明涉及一种视频图像的编码方法,尤其是一种将视频图像最大宏块类型与编码块模式(即CBP)联合编码的方法,属于图像编码技术领域。
背景技术
随着科技的飞速发展,多媒体、网络通信已经成为我们生活中的一部分,它们为服务和丰富人类的生活作出了巨大贡献。数字压缩作为数字化技术的核心之一,成为多媒体应用发展的关键。高效的视频编解码技术是实现高质量、低成本多媒体数据存储与传输不可缺少的。
视频编解码性能的提高使很多多媒体应用能够在有限的条件下能够实现。现在比较流行的图像编码国际标准,一般采用的是基于块匹配的帧内预测、运动补偿、离散余弦变换和量化及熵编码相结合的编码方法。去除视频图像时间、空间及主观视觉上的冗余,使在保持一定视频效果的条件下,将需要的编码数量降到最低。
视频序列的图像是基于宏块进行编码的。通常,一种图像类型有多种宏块类型,编码时选择一种宏块类型对当前宏块进行编码。这些宏块类型被依照某种次序赋予从小到大不同的参数值。这些参数值就是宏块类型的标识。在某种图像类型下宏块类型参数值最大的宏块类型就是所谓的最大宏块类型。
例如:图像类型为P帧,P帧中有6种宏块类型16×16、16×8、8×16、8×8、8×8ref0、Intra8×8,按照这种次序给它们赋予0-5的数值(见表1),16×16-0、16×8-1、8×16-2、8×8-3、8×8ref0-4、Intra-5。这里最大宏块类型就是Intra,其参数值在P帧图像类型中参数值最大,为5。
编码宏块类型时就是编码这些参数值。如果编码16×8的宏块类型,就对参数值1编码。解码宏块类型时,如果得到的值是1,解码器就可以确定宏块类型是16×8。
表1.P帧宏块类型及其参数值对映表
Code_number |
MB_Type |
P帧 |
0 |
16×16 |
1 |
16×8 |
2 |
8×16 |
3 |
8×8 |
4 |
8×8(ref=0) |
5 |
Intra |
编码完宏块类型还要对宏块的CBP映射值进行编码。CBP是表示宏块的几个8×8亮度块和色度块是否含有非0变换系数值的6位二进制宏块参数。CBP的低四位的每一bit位分别对应4个8×8亮度块。如果某一8×8亮度块变换系数全为0,对应的bit位是0,如果亮度块变换系数至少有一个不为0,对应的bit位是1。
CBP的高两位表示宏块的两个色度块的变换系数情况,和亮度块一样,如果一个色度块有非0系数,对应二进制位为1,否则为0。6位二进制一共可以有26=64(0~64)种CBP值,为了降低码率,编码器不直接将CBP的值写到码流中,而是先统计各种CBP值发生的概率,依照概率从高到低排列后,赋予映射值(见表2)。
比如,统计帧内编码CBP值为63情况下发生概率最高,31发生的概率次之,47排在63和31之后。就将CBP为63的映射值赋值为0,将CBP值为31的映射值赋值为1,CBP值为47的赋值为2,其它CBP的映射值根据概率大小依此类推。编码器编码CBP的映射值。
表2.CBP实际值与映射值的关系
code Num |
CBP xxxxxx (543210) |
帧内编码模式 |
帧间编码模式 |
0 |
63 |
0 |
1 |
31 |
1 |
2 |
47 |
2 |
3 |
15 |
4 |
4 |
0 |
8 |
5 |
7 |
16 |
6 |
11 |
32 |
7 |
13 |
48 |
8 |
14 |
3 |
9 |
55 |
5 |
... |
... |
... |
宏块类型和CBP等宏块参数都是使用0阶哥伦布码(如表3)对参数值进行编码的。下面是0阶哥伦布码的格式:
1
01x0
001x1x0
0001x2x1x0
00001x3x2x1x0
.................
其中:xn(n=0,1,2,...)取值为0或1。INFO=xn,...x1,x0。INFO的bit数目是n+1。0阶哥伦布码字与其表示的十进制参数值(code_number)的关系是
Code_number=2^L/2+INFO-1 (1)
L/2是L除以2结果的整数部分,当L=1时INFO=0。其中:L是0阶哥伦布码bit位的长度,L=2(n+1)+1。哥伦布码和参数值的对映关系见表3。
表3.统一变长编码(哥伦布码)和参数值的对映关系表
Code_number |
Code word |
0 |
1 |
1 |
010 |
2 |
011 |
3 |
00100 |
4 |
00101 |
5 |
00110 |
6 |
00111 |
7 |
0001000 |
8 |
0001001 |
9 |
0001010 |
10 |
0001011 |
...... |
....... |
例如:表中参数值5,哥伦布码长L=5并且INFO=10(二进制)=2(十进制)。5=2^5/2+2-1满足公式(1)。编码器将参数值按照公式(1)转换成哥伦布码写到码流中。解码器通过读N-1 bit的0后读到一个1,然后再读N-1个bit位的值,这N个bit位的二进制值就是INFO值。知道INFO值和N(=n+1)值就可以由公式(1)解出对映的参数值。
现有技术中,码流中宏块类型值接下来就是CBP映射值,两者是独立编码的。如:宏块类型值是3(哥伦布码为00100),CBP映射值是10(哥伦布码为0001011),则码流为...001000001011...,解码端读到00100知道宏块类型参数值是3,接下来读到0001011知道CBP映射值是10。但如果宏块类型的参数值是5(哥伦布码为00110),假设5是最大宏块类型的参数值,CBP映射值是7(哥伦布码为0001000),则码流为...001100001000...
通过以上的描述,可以看出这种分别独立进行编码的方式的编码效率很低,而对于图像编码而言,编码的效率是非常重要的,直接决定了传输的成本,如何解决这一编码效率低下的问题,成为进一步提高视频图像编码效率的一个难题。
发明内容
本发明所要解决的技术问题在于:提出一种视频图像宏块类型与CBP联合编码的方法,进一步降低图像编码后的比特数,提高编码效率,减少传输代价。
一种最大宏块类型与CBP联合编码的方法,在编码端,包括如下步骤:
步骤一、获取待编码图像的宏块类型,判断待编码的宏块类型值i是否为最大宏块类型值M,i是否等于M;判断待编码图像的类型,根据对应的编码宏块类型的编码码表;查询该码表获得待编码宏块类型值i和最大宏块类型值M;
步骤二、如果不是最大宏块类型值(即i≠M),则编码宏块类型值i,然后编码CBP映射值j;
步骤三、如果是最大宏块类型值(即i=M),则读取CBP映射值j,然后计算最大宏块类型值与CBP映射值的和(M+j),并编码(M+j)。
在解码端,包括如下步骤:
步骤一、从码流中读取宏块类型值i;
步骤二、判断i是否大于等于最大宏块类型值(i>=M?);
步骤三、如果不是(i<M),则通过宏块类型就是编码端规定的参数值i对映的宏块类型,然后再从码流中读取CBP的映射值;
步骤四、如果宏块类型值大于或等于最大宏块类型值(i>=M)则确定宏块类型为最大宏块类型,并且CBP映射值j=i-M。
本发明通过最大宏块类型与CBP联合编码可以节省更多的编码bit数目,提高压缩效率,同时不改变解码端的语法结构,并且几乎不增加解码端的解码复杂度及解码器硬件的实现复杂度。
附图说明
图1本发明技术方案编码端编码的流程示意图;
图2本发明技术方案解码端解码的流程示意图。
具体实施方式
本发明的方案不涉及宏块的编码,只涉及宏块类型的编码以及CBP的编码。本发明考虑到当编码器编码宏块类型时,如果该宏块类型是最大宏块类型,将这个宏块类型参数值与CBP映射值联合编码,就不用再编码CBP了,以此来提高编码效率。
由于CBP映射值是0~63的整数,所以最大宏块类型参数值与CBP映射值的和一定大于或等于最大宏块类型参数值。这样,在解码端如果得到宏块类型参数值小于最大宏块类型的参数值,可以知道对应该参数值的宏块类型,然后照常从码流中读CBP,否则,宏块类型参数值等于或大于最大宏块类型参数值,可以肯定该宏块类型是参数值最大的宏块类型,同时这个参数值是带有CBP联合编码的参数值,只要用这个参数值减去最大的参数值就可以得到CBP的映射值,就不必到后面的码流中读CBP了。
本发明的技术方案,在编码端,如图1所示,包括如下步骤:
步骤一、选择宏块类型,判断选择的宏块类型值i是否为最大宏块类型值M,i是否等于M;判断待编码图像的类型,根据对应的编码宏块类型的编码码表;查询该码表获得待编码宏块类型值i和最大宏块类型值M;
步骤二、如果不是最大宏块类型值(即i≠M),则编码宏块类型值i,然后编码CBP映射值j;
步骤三、如果是最大宏块类型值(即i=M),则读取CBP映射值j,然后计算最大宏块类型值与CBP映射值的和(M+j),并编码(M+j)。
在解码端,如图2所示,包括如下步骤:
步骤一、从码流中读到宏块类型值i;
步骤二、判断i是否大于等于最大宏块类型值(i>=M?);
步骤三、如果不是(i<M),则通过宏块类型就是编码端规定的参数值i对映的宏块类型,然后再从码流中读取CBP的映射值;
步骤四、如果宏块类型值大于或等于最大宏块类型值(i>=M)则确定宏块类型为最大宏块类型,并且CBP映射值j=i-M。
例如:宏块编码类型参数值是5,CBP映射值是7,5为当前图像类型下最大的宏块类型参数值,则采用联合编码
5(宏块类型参数值)+7(CBP映射值)=12(联合编码值)
将联合编码的值12(哥伦布码为0001101)写到码流中宏块类型的位置上,不再写CBP的映射值。解码时,得到宏块类型参数值后,如果该值小于5,则还按照宏块类型和CBP独立编码那样,接下来继续读码流得到CBP映射值。否则,参数值大于或等于5,这个值就是联合编码值。可以确定宏块类型参数值为5,并且不用再从码流中读CBP映射值,可以通过12-5=7得到CBP映射值为7。
从这个例子中看出,使用以前的编码方法,宏块类型参数值为5,CBP映射值为7,码流为001100001000,而使用我们的方法码流为0001101,节省了5bit。
如表4所示,是P帧宏块类型与CBP联合编码后的效果列表,本发明的方法,不限于对P帧图像;也同样可以适用于I帧和B帧。
表4.最大宏块类型和CBP联合编码与独立编码比较表
最大宏块类型参数值 |
CBP映射值 |
联合编码值 |
独立编码值 |
节省(bit) |
哥伦布码 |
十进制值 |
哥伦布码 |
十进制值 |
哥伦布码 |
十进制值 |
哥伦布码 |
|
00110 |
5 |
1 |
0 |
00110 |
5 |
001101 |
1 |
00110 |
5 |
010 |
1 |
00111 |
6 |
00110010 |
3 |
00110 |
5 |
011 |
2 |
0001000 |
7 |
00110011 |
1 |
00110 |
5 |
00100 |
3 |
0001001 |
8 |
0011000100 |
3 |
00110 |
5 |
00101 |
4 |
0001010 |
9 |
0011000101 |
3 |
00110 |
5 |
00110 |
5 |
0001011 |
10 |
0011000110 |
3 |
00110 |
5 |
00111 |
6 |
0001100 |
11 |
0011000111 |
3 |
00110 |
5 |
0001000 |
7 |
0001101 |
12 |
001100001000 |
5 |
00110 |
5 |
0001001 |
8 |
0001110 |
13 |
001100001001 |
5 |
00110 |
5 |
0001010 |
9 |
0001111 |
14 |
001100001010 |
5 |
....... |
....... |
....... |
....... |
....... |
....... |
....... |
....... |
下面通过一个具体实施例,来进一步说明本发明的技术方案:
编码端:当前编码帧为P帧,P帧中有16×16、16×8、8×16、8×8、8×8ref0、Intra6种宏块类型,对应的参数值依次为0~5。Intra是所有类型中最大的宏块类型,值为5。
当前宏块经过RDO选择,如果采用了Intra宏块类型编码。然后计算在Intra类型下编码的宏块CBP值为101000,其映射值为8。求5+8=13,13作为宏块类型,其对映的哥伦布码被写到码流中传输到解码端。
解码端:得到码流中的宏块类型值为13,并且判断当前帧为P帧。发现P帧中最大的宏块类型是5,而现在是13,就确定13是Intra宏块类型与CBP的联合编码值。因此确定当前宏块类型为Intra,并且不必读取下一个码字作为CBP映射值。它的CBP映射值可以通过13-5=8得到。
本发明所述的码表中最大类型与其后数据的联合编码方法除了对宏块类型和CBP联合编码外,还可以适用与图像块的变换系数与其后的逃避码(escape_level)值的联合编码。
在对图像块的变换系数进行熵编码时如果变换系数码字(codeNum)等于59,59是熵编码码表允许的最大codeNum值,可以将这个最大的codeNum值59与其后面的escape_level值联合编码。具体为:
步骤01、获取待编码图像的codeNum,判断该codeNum值是否等于59;
步骤02、如果该codeNum值是否不等于59,则编码codeNum值,再编码escape_level值;
步骤03、如果该codeNum值是否等于59,则读取其后的escape_level值,然后计算escape_level+59,并直接编码escape_level+59。
最后所应说明的是:以上实施例仅用以说明而非限制本发明的技术方案,尽管参照上述实施例对本发明进行了详细说明,本领域的普通技术人员应当理解:依然可以对本发明进行修改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,均应涵盖在本发明的权利要求范围当中。