具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明基于图层分解的视频编解码方法将当前输入图像分为静止图层区域和运动图层区域,包含运动图像像素的宏块为运动图层宏块,其它宏块为静止图层宏块。对静止图层和运动图层区域采用四分树的描述方法,用若干个矩形区域子图包含所有的运动图层宏块,并用四分法将各矩形区域子图分为更小的矩形区域子图,对每个矩形区域子图用四分树描述其属于运动图层还是静止图层并用图层标识(block_layer_flag)进行标记,并获得每一个宏块的图层属性。采用四分树的图层区域描述方法,减少了运动图层区域中的背景图像内容,解决了序列中有多个运动目标分布于图像中的图层区域描述问题。如果视频序列中有多个运动目标,则可以用一个矩形区域子图包含单独一个运动目标,也可以将空间上相邻的矩形区域子图合并为一个较大的矩形区域子图后再采用四分法描述,以降低编解码器实现的复杂度。如果图像分割到的一个运动目标区域包含了多个运动物体,则其中可能包括了较多的背景图像内容,对这样的区域进行***再采用四分法描述,可减少运动目标区域中的背景图像内容比例,从而提高编码效率。
请参照图1所示,本发明基于图层分解的视频编解码方法包括如下步骤:
步骤101:将当前输入图像分为静止图层区域和运动图层区域;
在步骤101中,对输入图像进行运动目标检测,根据运动目标检测的结果,包含运动图层像素的宏块为运动图层宏块,其他宏块为静止图层宏块,运动图层宏块组成运动图层区域,静止图层宏块组成静止图层区域,运动图层是当前帧中的运动图层区域,静止图层包括当前帧中的静止图层区域以及以前帧中的静止图层区域。本实施例中,可以用常用的运动检测算法,例如混合高斯模型,帧差法等;还可以对运动检测算法得到的运动区域进行处理,以减少噪声等干扰,如采用形态学操作、帧间连续性分析等。
步骤102:用一个或者多个矩形区域子图分别包含所有运动图层宏块;
在步骤102中,可以用一个矩形区域子图包含所有的运动图层宏块,也可以根据运动目标检测的结果,用一个矩形区域子图包含一个运动目标区域,另外矩形区域子图也可以包含整帧图像。本实施例中,编码器可以预先设定允许的最大矩形区域子图数,如果矩形区域子图数超过了编码器允许的最大数目,则可将小的矩形区域子图合并为一个大的矩形区域子图。
步骤103:将各矩形区域子图用四分法分为更小的矩形区域子图,对每个矩形区域子图用四分树描述其属于静止图层还是运动图层并用block_layer_flag进行标记。
步骤104:宏块的(宏块层标识)mb_layer_flag取值为宏块所属矩形区域子图的block_layer_flag,对每个宏块进行编码。
在本发明实施例中,对静止图层和运动图层区域的编码方法是对静止图层和运动图层区域采用四分树的描述方法,用若干矩形区域子图分别包含所有运动图层宏块,并对每个矩形区域子图用四分树描述其属于静止图层还是运动图层,每个宏块的mb_layer_flag取值为宏块所属矩形区域子图的block_layer_flag。编码器对各矩形区域子图的block_layer_flag进行编码传输,解码端从码流中解析得到各矩形区域子图的block_layer_flag,进一步得到每个宏块的mb_layer_flag。block_layer_flag可以直接传输也可以采用熵编码,例如采用霍夫曼编码。除了采用本实施例中的区域描述方法外,还可以用其他方法,例如基于宏块的游程码或链码,或者用一个矩形包含所有的运动图层宏块。
图2为本发明获得运动图层和静止图层矩形区域子图的流程图。如图2所示,其包括如下步骤:
步骤201:用若干个矩形区域子图分别包含所有运动图层宏块;
步骤202:合并矩形区域子图,计算矩形区域子图与周围其他矩形区域子图的两两之间的宏块距离,如果两个矩形区域子图的距离小于预设的阈值TH3,而且两个矩形区域子图合并后运动图层宏块数占合并后的大矩形区域总宏块数的比例大于预设的阈值TH4,则将这两个矩形区域子图合并成一个大的矩形区域子图,继续合并矩形区域子图直至合并后的矩形区域子图数目不大于预设的阈值TH5;在此,由于合并后的矩形区域包含原被合并的矩形区域,因此可能会有原属于静止图层的宏块被包含进来。
此外,还可检查所有矩形区域,如果某矩形区域中运动图层宏块数占该矩形区域总宏块数的比例小于某一预设阈值,且矩形区域子图数目不大于预设的阈值TH5,则可将该矩形区域子图分割成二个矩形区域子图,分割后使一些宏块被划入静止图层,使二个新矩形区域子图中的运动图层宏块数占总宏块数的比例变小,继续分割矩形区域子图直至各矩形区域子图中运动图层宏块数占总宏块数的比例小于某一预设阈值或分割后的矩形区域子图数目大于等于预设的阈值TH5。
其中,两个矩形区域子图的距离定义为这两个矩形任意顶点间的最小距离。阈值TH3和TH4由当前图像的纹理特征和运动特性决定,如果纹理特征比较丰富有较多的细节且有一定的运动,或者有较多的运动目标或者运动特性比较丰富,则常会检测到较多的运动区域,因此需要多个矩形区域子图实现对运动图层的描述,可以设定一个较小的TH3和较大的TH4。可通过统计得到合适的阈值,例如TH5设为4,而对于一般的序列,TH5设为2,用1个或2个矩形区域子图就可以实现对静止图层和运动图层的描述。
通过将邻近的矩形区域子图合并,以减少描述静止图层和运动图层所需的比特数,并且也降低了编解码器的复杂度。
图3为本发明四分法的流程图,其包括如下步骤:
步骤301:计算四分树根结点所表示矩形区域子图的宽(width)、高(height)和位置;
步骤311:如果矩形区域子图width<height/2,则执行步骤312,否则执行步骤313;
步骤312:矩形区域子图四分时宽度方向不分;
步骤313:如果width为奇数,则执行步骤314,否则执行步骤315;
步骤314:矩形区域子图四分时宽度左右相差1;
步骤315:矩形区域子图四分时宽度方向二等分;
步骤321:如果矩形区域子图height<width/2,则执行步骤322,否则执行步骤323;
步骤322:矩形区域子图四分时高度方向不分;
步骤323:如果height为奇数,则执行步骤324,否则执行步骤325;
步骤324:矩形区域子图四分时高度上下相差1;
步骤325:矩形区域子图四分时高度方向二等分。
其中,步骤311~315为执行矩形区域子图四分法时的宽度方向分割,而步骤321~325为执行矩形区域子图四分法时的高度方向分割,在对宽度或高度方向中的一个方向判断时,各个步骤之间的执行顺序如上所述。对于两个方向之间的执行顺序不做限制,可以上述两个方向的步骤同时执行,也可以按照任意的先后顺序执行上述两个方向的步骤,结果不变。
其中,对不同形状的矩形采用不同的四分法,对于宽度远小于高度的矩形(width<height/2),四分时宽度方向不分,对于高度远小于高度(height<width/2)的矩形,四分时高度方向不分,对于矩形区域子图的width或height不是偶数时,将矩形区域子图分为大小不等的四个子块,如果width为奇数,则分为宽度左右相差1的子图,此时,编解码器采用相同的四分规则,分为左边块的宽度比右边块的宽度多一个宏块或者相反的规则,如果height为奇数,则分为高度上下相差1的子图,编解码器采用相同的四分规则,分为上边块的高度比下边块的高度多一宏块或者相反的规则。编码器对四分树根结点的矩形区域子图的width,height和位置进行编码传输,而其他各级矩形区域子图的width,height和位置由上一级的矩形区域子图的width,height和位置计算得到,在每一次四分时,均对该矩形区域子图的四分法根据该矩形区域子图的width,height进行选择。除了本实施例三中所描述的方法,还可以将矩形区域扩充,使得高度和宽度均为偶数或2的幂,再进行四分。
如图4所示,对每个矩形区域子图用四分树描述其属于静止图层还是运动图层,并用block_layer_flag进行标记的具体步骤如下:
步骤401:读取一个四分树根结点表示的矩形区域子图的width,height以及位置;
步骤402:根据矩形区域子图是否包含运动图层宏块,如果否,则执行步骤403,否则执行步骤404;
步骤403:该矩形区域子图属于静止图层区域,block_layer_flag置为L1,该矩形区域子图不再继续分,执行步骤408;
步骤404:判断矩形区域子图是否包含静止图层宏块,如果否,则执行步骤405,否则执行步骤406;
步骤405:该矩形区域子图属于运动图层区域,block_layer_flag置为L2,该矩形区域子图不再继续分,执行步骤408;
步骤406:判断分割次数是否大于设定的阈值(TH1)或者矩形区域子图的大小小于设定的分割最小阈值(TH2),如果是,则执行步骤405,否则执行步骤407;
步骤407:将block_layer_flag置为L0,继续四分为更小的矩形区域子图进行判断,执行步骤402;
步骤408:判断是否已经完成四分树根结点所表示的矩形区域子图的各级矩形区域子图四分法描述并标记block_layer_flag,如果是,则结束,否则执行步骤409;
步骤409:取下一个未执行四分树描述的矩形区域子图,执行步骤402。
其中,用block_layer_flag对不同矩形区域子图进行标记,L1表示静止图层区域,L2表示运动图层区域,L0表示该矩形区域子图需要继续分块,其中,L0,L1,L2是不同的整数,例如可以设L0为0,L1为1,L2为2,如果分为多个运动图层,则每一个运动图层均赋不同的正整数用于标记,L2是这些正整数的集合。
在本发明实施例中,所述矩形区域子图也可以是整帧图像,即对整帧图像用一个四分树描述,则不需要传递四分树根结点所表示的矩形区域子图的width,height及位置,只需要在码流中将图像区域标识(pic_layer_flag)置1或者一个正整数,表示当前矩形区域子图是整帧图像。
图5为当前帧中已编码的相邻块的位置示意图,分别取当前块(Curr)的左边块(A)、上边块(B)、右上块(C)、左上块(D)。图6为当前块在已编码帧中对应相同位置及其八邻域内的块的位置示意图,即与当前块相同位置的块(E’)、左边块(A’)、上边块(B’)、右上块(C’)、左上块(D’)、右边块(F’)、左下块(G’)、下边块(H’)、右下块(I’)。具体视频编码方法中所用邻域并不限于所述的八邻域范围,还可以是根据运动方向,即运动矢量相反方向所指示的块及相邻块。
图7为本发明视频编码方法中运动矢量的预测方法的流程图,其帧间预测还包括如下步骤:
步骤701:判断当前编码块的预测编码模式,如果是层内预测编码,则执行步骤702,否则执行步骤703;
步骤702:用当前帧中已编码的相邻块,已编码帧中与当前编码块位置相同的块及其邻域内的块中的采用层内预测编码的块的运动矢量计算当前编码块的运动矢量预测值,所用的块必须存在运动矢量,并且与当前编码块属于相同的图层;
步骤703:用当前帧中已编码的相邻块,已编码帧中与当前编码块位置相同的块及其邻域内的块中的采用层间预测编码的块的运动矢量计算当前编码块的运动矢量预测值,所用的块必须存在运动矢量,并且与当前编码块属于相同的图层。
现有的视频编解码标准如H.264、AVS中,可用的块是指与当前编码块属于同一条带的有运动矢量的块,本发明实施例中,利用图层的运动特性进行预测,所用的块除了要满足上述现有的视频编解码标准中可用块的条件,还要满足与当前编码块属于同一图层的条件。因为不同的图层运动特性并不相同,若根据图层的运动特性对不同的图层采用不同的运动矢量预测策略,则可以使运动矢量的预测更加准确。在本实施例中,利用同一图层的块进行运动矢量预测,根据运动矢量的空间相关性、时间相关性,以及图层的运动特性分别计算当前编码块的层间预测编码的运动矢量预测值和层内预测编码的运动矢量预测值。
图8是本发明视频编码方法中运动矢量预测值的计算方法流程图,其包括如下步骤:
步骤801:如果当前帧已编码的相邻块A~D中有三个或以上块运动矢量可用,则执行步骤802,否则执行步骤803;
步骤802:取当前帧中三个可用的相邻块的运动矢量的中值作为当前编码块的运动矢量预测值;
在本步骤中,相邻块位置如图5所示,如果当前帧已编码相邻块A~D的运动矢量都可用,则当前块的运动矢量预测值取当前块Curr的左边块A,上边块B和右上块C的运动矢量的中值,否则取相邻块A~D中三个块的运动矢量的中值作为当前块的运动矢量预测值。
步骤803:如果当前帧已编码的相邻块A~D中只有两个或一个是块运动矢量可用,则执行步骤804,否则执行步骤805;
步骤804:取当前帧中可用的相邻块的运动矢量的平均值作为当前编码块的运动矢量预测值;
步骤805:如果已编码帧中与当前编码块位置相同的块运动矢量是可用的,则执行步骤806,否则执行步骤807;
步骤806:则取已编码帧中与当前编码块位置相同的块的运动矢量作为当前编码块的运动矢量预测值;
步骤807:如果已编码帧中与当前编码块位置相同块的邻域内块的运动矢量是可用的,执行步骤808,否则执行步骤809;
步骤808:取其邻域内块的运动矢量的平均值或者中值作为当前编码块的运动矢量预测值。
在本步骤中,如果已编码帧八邻域内有多个可用块,则运动矢量预测值取所有可用块的运动矢量的平均值或者中值。
步骤809:取零运动矢量为当前编码块的运动矢量预测值。
本发明实施例中,利用空间相关性,时间相关性,以及图层的运动特性对当前块的运动矢量预测值进行计算,在现有的视频编码标准中,如H.264、AVS,运动矢量预测值均采用中值预测,即取当前帧中的左边块A,上边块B,右上块C的运动矢量的中值,这种预测方法利用相邻块的运动相关性进行预测,但对于不同运动目标之间的块运动预测效果不佳,对于存在局部运动或者较复杂的运动的序列,中值预测效果也不理想。在本发明图8所示的实施例中,利用了图层的运动特性,首先利用当前帧中相邻块A~D中同一图层的块进行预测,如果不存在,则利用已编码帧中A’~I’中同一图层的块进行预测,结合空域和时域相关性,提高了运动矢量预测的准确性,减少了描述运动信息的比特数,提高了编解码效率。
在图7和图8所示的实施例中,已编码帧是指先于当前帧进行编码的图像帧,但是播放顺序上可以滞后于当前帧。如果当前编码块是前向预测,按照图7和图8所示步骤执行;如果当前编码块是双向预测,则已编码帧包括在播放顺序上一前一后的两帧,需要对这两帧都执行图7和图8所示的步骤。
图9是本发明的视频解码流程图,其包括如下步骤:
步骤901:从码流中提取各矩形区域子图的宽(width)、高(height)和位置,采用与视频编码时相同规则重建四分树,获得各矩形区域子图的图层标识(block_layer_flag),block_layer_flag值为L1的矩形区域子图是静止图层区域,block_layer_flag值为L2的矩形区域子图是运动图层区域;
步骤902:宏块的图层属性(mb_layer_flag)取值为宏块所属矩形区域子图的图层标识block_layer_flag;
步骤903:计算当前块的运动矢量预测值,解码当前块的运动矢量信息,得到当前块的运动矢量。
步骤904:对每个宏块进行解码。
由于对视频流的解码是视频编码的逆过程,对子图的四分树划分规则、四分树的级数、运动矢量的预测方法必须与编码时完全相同。对每个宏块的解码可采用与编码时相同的一般视频编解码标准所采用的重建图像方法。
图10为本发明视频解码方法对每个宏块进行解码的方法的流程图,其包括如下步骤:
步骤1001:解码得到当前块的预测编码模式,若采用层内预测编码,则执行步骤1002,否则执行步骤1003;
步骤1002:用当前帧中已解码的相邻块、已解码帧中与当前块位置相同的块及其邻域内的块中的采用层内预测编码的块计算运动矢量预测值,所用的块必须存在运动矢量并且与当前块属于相同的图层;
步骤1003:用当前帧中已解码的相邻块、已解码帧中与当前块位置相同的块及其邻域内的块中的采用层间预测编码的块计算运动矢量预测值,所用的块必须存在运动矢量并且与当前块属于相同的图层。
本步骤中对当前块的运动矢量的预测方法是用当前帧中已解码的相邻块A~D、已解码帧中与当前块位置相同的块E’及其邻域内的块A’~D’、F’~I’,对当前块Curr的运动矢量进行预测,可用的块必须有运动矢量并且与当前块属于相同的图层,如果可用块采用层内帧间预测编码,则可用块用于计算当前编码块层内帧间预测编码的运动矢量预测值,如果可用块采用层间帧间预测编码,则可用块用于计算当前编码块层间帧间预测编码的运动矢量预测值。
图11是本发明视频解码方法中运动矢量预测值的计算方法的流程图,其包括如下步骤:
步骤1101:如果当前帧已解码的相邻块A~D中有三个或以上是块运动矢量是可用的,则执行步骤1102,否则执行步骤1103;
步骤1102:取当前帧中三个可用的相邻块的运动矢量的中值作为当前块的运动矢量预测值;
在本步骤中,相邻块位置如图5所示,如果当前帧已解码相邻块A~D的运动矢量都可用,则当前块的运动矢量预测值取当前块Curr的左边块A,上边块B和右上块C的运动矢量的中值,否则取相邻块A~D中三个块的运动矢量的中值作为当前块的运动矢量预测值。
步骤1103:如果当前帧已编码的相邻块A~D中只有两个或一个块运动矢量是可用的,则执行步骤1104,否则执行步骤1105;
步骤1104:取当前帧中可用的相邻块的运动矢量的平均值作为当前块的运动矢量预测值;
步骤1105:如果已解码帧中与当前块位置相同的块运动矢量是可用的,则执行步骤1106,否则执行步骤1107;
步骤1106:则取已解码帧中与当前块位置相同的块的运动矢量作为当前块的运动矢量预测值;
步骤1107:如果已解码帧中与当前编码块位置相同块的邻域内块的运动矢量是可用的,执行步骤1108,否则执行步骤1109;
步骤1108:取邻域内块的运动矢量的平均值或者中值作为当前块的运动矢量预测值;
在本步骤中,如果已解码帧八邻域内有多个可用块,则运动矢量预测值取所有可用块的运动矢量的平均值或者中值。
步骤1109:取零运动矢量为当前块的运动矢量预测值。
在图10和图11所示的实施例中,已解码帧是指先于当前帧进行解码的图像帧,但在播放顺序上可以滞后于当前帧。如果当前块是前向预测,按照图10和图11所示步骤执行;如果当前块是双向预测,则已解码帧包括在播放顺序上一前一后的两帧,需要对这两帧都执行图10和图11中的步骤。
对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。