JPEG图像解码方法和解码器转让专利

申请号 : CN201610014062.7

文献号 : CN105578194B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 涂尚斌王文函

申请人 : 珠海全志科技股份有限公司

摘要 :

本发明公开了一种JPEG图像解码方法和解码器,其中方法包括如下步骤:对与显示需求信号相应的整帧图像进行熵解码,建立相应的整帧索引表;根据显示需求信号计算图像解码块大小,并根据计算得到的图像解码块大小分割整帧图像,确定整帧图像中与显示需求信号相应的实际显示区域;根据实际显示区域由整帧图像中选择相应的解码图像;并根据整帧索引表建立子图像索引表,同时对解码图像进行码流拼接;根据子图像索引表,对解码图像进行解码。其实现了分块解码的目的,避免了对整帧图像的全部解码,因此节省了解码时间,提高了图像解码效率。最终有效解决了传统的图像解码方法的解码效率较低的问题。

权利要求 :

1.一种JPEG图像解码方法,其特征在于,包括如下步骤:

对与显示需求信号相应的整帧图像进行熵解码,建立相应的整帧索引表;其中,所述整帧索引表包括:所述整帧图像中每个索引单元对应的码流位置、第一直流分量以及第一复位序号;所述索引单元为所述整帧图像中固定间隔内包含预设个数的最小编码单元的集合;

根据所述显示需求信号计算图像解码块大小,并根据计算得到的所述图像解码块大小分割所述整帧图像,确定所述整帧图像中与所述显示需求信号相应的实际显示区域;

根据所述实际显示区域由所述整帧图像中选择相应的解码图像;并根据所述整帧索引表建立子图像索引表,同时对所述解码图像进行码流拼接;其中,所述子图像索引表包括:所述解码图像中每一行码流对应的码流偏移、码流长度、第二直流分量和第二复位序号;

根据所述子图像索引表,对所述解码图像进行解码;

其中,所述码流位置为每一个索引单元中第一个最小编码单元的左上角顶点像素点对应Y分量在图像码流中的比特位置;所述第一直流分量为每一个索引单元的前一个索引单元中最后一个最小编码单元的右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量;所述第一复位序号为每一个索引单元中第一个最小编码单元在直流信号复位周期中的序号;

所述码流偏移为每次导入数据存储模块中的码流在所述数据存储模块中的位置相对于所述数据存储模块的起始位置的偏移比特数;所述码流长度指的是每次导入所述数据存储模块中的码流的比特长度;所述第二直流分量为紧邻所述解码图像的左边界位置的索引单元的前一个索引单元中的最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量;所述第二复位序号为由所述整帧索引表中所提取出来的紧邻解码图像左边界的索引单元中第一个最小编码单元在直流信号复位周期中的序号。

2.根据权利要求1所述的方法,其特征在于,所述对与显示需求信号相应的整帧图像进行熵解码,建立相应的整帧索引表,包括如下步骤:解析所述整帧图像的文件头,获取复位间隔;并设定固定间隔的当前索引单元中的最小编码单元个数为预设个数;

由所述整帧图像的首行编码单元开始,按照从左到右的顺序依次对每个最小编码单元进行熵解码并计数;

根据对所述最小编码单元的计数,记录每个所述索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置,以及每个所述索引单元的前一个索引单元中最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量,以及每个所述索引单元中第一个最小编码单元在直流信号复位周期中的序号;

其中,每个最小编码单元中的一个8x8大小的像素块为所述基本块。

3.根据权利要求1所述的方法,其特征在于,所述根据所述显示需求信号计算图像解码块大小,并根据计算得到的所述图像解码块大小分割所述整帧图像,确定所述整帧图像中与所述显示需求信号相应的实际显示区域,包括如下步骤:根据所述显示需求信号,获取需要显示区域的坐标和缩放倍数;

根据所述需要显示区域的坐标和缩放倍数,计算所述图像解码块大小;

根据所述图像解码块大小分割所述整帧图像,确定所述整帧图像中与所述显示需求信号相应的实际显示区域。

4.根据权利要求1所述的方法,其特征在于,所述根据所述实际显示区域由所述整帧图像中选择相应的解码图像,包括如下步骤:分别以所述实际显示区域的上边界、下边界、左边界和右边界为基准,确定所述整帧图像中紧邻所述上边界的一组索引单元、紧邻下边界的一组索引单元、紧邻左边界的一组索引单元和紧邻右边界的一组索引单元;

将紧邻左边界的一组索引单元与紧邻上边界的一组索引单元的交点对应的最小编码单元的左上角顶点像素点的坐标位置标记为(left,top),将紧邻右边界的一组索引单元与紧邻下边界的一组索引单元的交点对应的最小编码单元的右下角顶点像素点的坐标位置标记为(right,bottom);

以所述坐标位置为(left,top)的像素点的横坐标为左边界,纵坐标为上边界,以所述坐标位置为(right,bottom)的像素点的横坐标为右边界,纵坐标为下边界围成的区域作为所述解码图像。

5.根据权利要求1所述的方法,其特征在于,所述根据所述整帧索引表建立子图像索引表,包括如下步骤:读取所述整帧索引表,获取紧邻所述解码图像左边界的索引单元对应的码流位置、第一直流分量以及第一复位序号,以及紧邻所述解码图像右边界的索引单元对应的码流位置;

根据紧邻所述解码图像左边界的索引单元对应的码流位置,以及紧邻所述解码图像右边界的索引单元对应的码流位置,计算得到所述解码图像每一行码流对应的码流偏移和码流长度,作为子图像索引表中该行码流对应的码流偏移和码流长度;

将所述解码图像每一行中紧邻所述解码图像左边界的索引单元对应的第一直流分量和第一复位序号分别作为子图像索引表中该行码流对应的第二直流分量和第二复位序号。

6.根据权利要求5所述的方法,其特征在于,所述根据紧邻所述解码图像左边界的索引单元对应的码流位置,以及紧邻所述解码图像右边界的索引单元对应的码流位置,计算得到所述解码图像中每一行码流对应的码流偏移和码流长度,包括如下步骤:初始化所述解码图像中首行码流导入数据存储模块的起始地址相对于整个数据存储模块的起始地址的偏移vbv_offset为0;

以紧邻所述解码图像左边界的索引单元中第一个最小编码单元作为所述解码图像每一行的首部,根据公式:offset0=bitoffset0/8*8,计算得到每一行首部码流字节对齐偏移offset0;其中,bitoffset0为紧邻所述解码图像左边界的索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置;

根据公式:bit_added=bitoffset0-offset0,计算每一行首部对齐增加的比特位bit_added;

以紧邻所述解码图像右边界的索引单元中第一个最小编码单元的位置作为所述解码图像每一行的尾部,根据公式:offset1=(bitoffset8+7)/8*8,计算得到每一行尾部码流字节对齐偏移offset1;其中,bitoffset8为紧邻所述解码图像右边界的索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置;

根据公式:imcu_bitlength=offset1-offset0,计算得到所述解码图像中每一行的码流长度imcu_bitlength;

根据公式:imcu_offset=bit_added+vbv_offset,计算得到所述解码图像中每一行的码流偏移imcu_offset;

对所述解码图像进行码流拼接。

7.根据权利要求6所述的方法,其特征在于,所述对所述解码图像进行码流拼接,包括如下步骤:由所述解码图像的首行码流开始,并由所述数据存储模块的起始地址作为初始导入位置,将所述解码图像每一行的码流以字节为单位导入所述数据存储模块中;

判断当前行导入所述数据存储模块中的码流最后一个字节是否为0xFF;

若是,则在当前行导入所述数据存储模块中的码流尾部增加一个0x00字节,并更新所述当前行的码流长度为:imcu_bitlength等于imcu_bitlength+8;

根据公式:vbv_offset=vbv_offset+imcu_bitlength,计算下一行码流导入数据存储模块的起始地址相对于整个数据存储模块的起始地址的偏移;

根据所述解码图像的全部码流导入所述数据存储模块的状态,控制码流导入过程的状态。

8.根据权利要求7所述的方法,其特征在于,所述根据所述解码图像的全部码流导入所述数据存储模块的状态,控制码流导入过程的状态,包括如下步骤:判断所述解码图像的码流是否全部导入所述数据存储模块;

若是,则停止码流拼接修复;

若否,则返回继续执行将所述解码图像每一行对应的区域的码流以字节为单位导入所述数据存储模块中的步骤。

9.根据权利要求1所述的方法,其特征在于,所述根据所述子图像索引表,对所述解码图像进行解码,包括如下步骤:实时判断所述解码图像中的当前行是否需要解码;

当判断出所述解码图像中的当前行需要解码时,读取当前行对应的子图像索引表,由所述子图像索引表中获取当前行的码流对应的码流偏移、码流长度、第二直流分量和第二复位序号;

根据解码图像中当前行的码流对应的码流偏移、码流长度、第二直流分量和第二复位序号,依次对当前行中每个索引单元中的最小编码单元进行熵解码;

判断完成熵解码的当前最小编码单元是否为所述实际显示区域边界之外的最小编码单元;

若是,则根据当前行是否为所述解码图像的最后一行,控制对所述解码图像的解码的状态;

若否,则对所述当前最小编码单元进行反扫描、反量化、反变换、裁剪和缩放后得到相应的解码结果,并存储所述解码结果。

10.一种解码器,其特征在于,包括整帧索引表建立模块、实际显示区域确定模块、子图像索引表建立模块、子图像解码模块和数据存储模块;

所述整帧索引表建立模块,被配置为对与显示需求信号相应的整帧图像进行熵解码,建立相应的整帧索引表;其中,所述整帧索引表包括:所述整帧图像中每个索引单元对应的码流位置、第一直流分量以及第一复位序号;所述索引单元为所述整帧图像中固定间隔内包含预设个数的最小编码单元的集合;

所述实际显示区域确定模块,被配置为根据所述显示需求信号计算图像解码块大小,并根据计算得到的所述图像解码块大小分割所述整帧图像,确定所述整帧图像中与所述显示需求信号相应的实际显示区域;

所述子图像索引表确定模块,被配置为根据所述实际显示区域由所述整帧图像中选择相应的解码图像;并根据所述整帧索引表建立子图像索引表,同时对所述解码图像进行码流拼接;其中,所述子图像索引表包括:所述解码图像中每一行码流对应的码流偏移、码流长度、第二直流分量和第二复位序号;

所述子图像解码模块,被配置为根据所述子图像索引表,对所述解码图像进行解码;

所述数据存储模块,被配置为存储所述整帧索引表和所述子图像索引表;

其中,所述码流位置为每一个索引单元中第一个最小编码单元的左上角顶点像素点对应Y分量在图像码流中的比特位置;所述第一直流分量为每一个索引单元的前一个索引单元中最后一个最小编码单元的右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量;所述第一复位序号为每一个索引单元中第一个最小编码单元在直流信号复位周期中的序号;

所述码流偏移为每次导入数据存储模块中的码流在所述数据存储模块中的位置相对于所述数据存储模块的起始位置的偏移比特数;所述码流长度指的是每次导入所述数据存储模块中的码流的比特长度;所述第二直流分量为紧邻所述解码图像的左边界位置的索引单元的前一个索引单元中的最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量;所述第二复位序号为由所述整帧索引表中所提取出来的紧邻解码图像左边界的索引单元中第一个最小编码单元在直流信号复位周期中的序号。

11.根据权利要求10所述的解码器,其特征在于,所述整帧索引表建立模块包括解析设定单元和解码计数单元;所述数据存储模块包括第一存储单元;

所述解析设定单元,被配置为解析所述整帧图像的文件头,获取复位间隔;并设定固定间隔的当前索引单元中的最小编码单元个数为预设个数;

所述解码计数单元,被配置为由所述整帧图像的首行编码单元开始,按照从左到右的顺序依次对每个最小编码单元进行熵解码并计数;

所述第一存储单元,被配置为根据对所述最小编码单元的计数,存储每个所述索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置,以及每个所述索引单元的前一个索引单元中最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量,以及每个所述索引单元中第一个最小编码单元在直流信号复位周期中的序号;

其中,每个最小编码单元中的一个8x8大小的像素块为所述基本块。

12.根据权利要求10所述的解码器,其特征在于,所述子图像索引表建立模块包括第一获取单元和第一计算单元;所述数据存储模块包括第二存储单元;

所述第一获取单元,被配置为读取所述整帧索引表,获取紧邻所述解码图像左边界的索引单元对应的码流位置、第一直流分量以及第一复位序号,以及紧邻所述解码图像右边界的索引单元对应的码流位置;

所述第一计算单元,被配置为根据紧邻所述解码图像左边界的索引单元对应的码流位置,以及紧邻所述解码图像右边界的索引单元对应的码流位置,计算得到所述解码图像每一行码流对应的码流偏移和码流长度,作为子图像索引表中该行码流对应的码流偏移和码流长度;

所述第二存储单元,被配置为存储所述解码图像每一行中紧邻所述解码图像左边界的索引单元对应的第一直流分量和第一复位序号分别作为所述解码图像中每一行码流对应的第二直流分量和第二复位序号,以及所述解码图像每一行码流对应的码流偏移和码流长度作为所述子图像索引表。

13.根据权利要求12所述的解码器,其特征在于,所述第一计算单元包括初始化子单元、首部偏移计算子单元、尾部偏移计算子单元、码流长度计算子单元和码流偏移计算子单元;

所述初始化子单元,被配置为初始化所述解码图像中首行码流导入数据存储模块的起始地址相对于整个数据存储模块的起始地址的偏移vbv_offset为0;

所述首部偏移计算子单元,被配置为以紧邻所述解码图像左边界的索引单元中第一个最小编码单元作为所述解码图像每一行的首部,根据公式:offset0=bitoffset0/8*8,计算得到每一行首部码流字节对齐偏移offset0;并根据公式:根据公式:bit_added=bitoffset0-offset0,计算每一行首部对齐增加的比特位bit_added;其中,bitoffset0为紧邻所述解码图像左边界的索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置;

所述尾部偏移计算子单元,被配置为以紧邻所述解码图像右边界的索引单元中第一个最小编码单元的位置作为所述解码图像每一行的尾部,根据公式:offset1=(bitoffset8+

7)/8*8,计算得到每一行尾部码流字节对齐偏移offset1;其中,bitoffset8为紧邻所述解码图像右边界的索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置;

所述码流长度计算子单元,被配置为根据公式:imcu_bitlength=offset1-offset0,计算得到所述解码图像中每一行的码流长度imcu_bitlength;

所述码流偏移计算子单元,被配置为根据公式:imcu_offset=bit_added+vbv_offset,计算得到所述解码图像中每一行的码流偏移imcu_offset。

14.根据权利要求13所述的解码器,其特征在于,所述子图像索引表建立模块还包括码流修复单元;

所述码流修复单元包括导入子单元、判断子单元和设置子单元;

所述导入子单元,被配置为由所述解码图像的首行码流开始,并由所述数据存储模块的起始地址作为初始导入位置,将所述解码图像每一行的码流以字节为单位导入所述数据存储模块中;

判断子单元,被配置为判断当前行导入所述数据存储模块中的码流最后一个字节是否为0xFF;

设置子单元,被配置为所述判断子单元判断出当前行导入所述数据存储模块中的码流最后一个字节是0xFF时,在当前行导入所述数据存储模块中的码流尾部增加一个0x00字节,并更新所述当前行的码流长度为:imcu_bitlength等于imcu_bitlength+8;并根据公式:vbv_offset=vbv_offset+imcu_bitlength,设置下一行码流导入数据存储模块的起始地址相对于整个数据存储模块的起始地址的偏移;并根据所述解码图像的全部码流导入所述数据存储模块的状态,控制码流导入过程的状态。

15.根据权利要求10所述的解码器,其特征在于,还包括控制模块、熵解码模块、反扫描反量化模块、反变换模块和裁剪缩放模块;

所述子图像解码模块包括实时判断单元、读取单元和越界判断单元;

所述控制模块,被配置为控制所述熵解码模块、所述反扫描反量化模块、所述反变换模块、所述裁剪缩放模块和所述子图像解码模块的启动和停止;

所述实时判断单元,被配置为实时判断所述解码图像中的当前行是否需要解码;

所述读取单元,被配置为当所述实时判断单元判断出所述解码图像中的当前行需要解码时,读取所述数据存储模块中存储的当前行对应的子图像索引表,由所述子图像索引表中获取当前行的码流对应的码流偏移、码流长度、第二直流分量和第二复位序号;

所述熵解码模块,被配置为根据当前行的码流对应的码流偏移、码流长度、第二直流分量和第二复位序号,依次对每个索引单元中的最小编码单元进行熵解码;

所述越界判断单元,被配置为判断完成熵解码的当前最小编码单元是否为所述实际显示区域边界之外的最小编码单元;

所述熵解码模块、所述反扫描反量化模块、所述反变换模块和所述裁剪缩放模块,分别被配置为当所述越界判断单元判断出所述当前最小编码单元为所述实际显示区域边界之内的最小编码单元时,对所述当前最小编码单元分别进行反扫描、反量化、反变换、裁剪和缩放,得到相应的解码结果;

所述数据存储模块,还被配置为存储所述解码结果。

说明书 :

JPEG图像解码方法和解码器

技术领域

[0001] 本发明涉及图像处理领域,特别是涉及一种JPEG图像解码方法和解码器。

背景技术

[0002] 随着多媒体技术的飞速发展,人们对视频图像的需求也不断增多。伴随着层出不穷的移动终端设备,高质量高效率的视频图像编解码方法变得越来越重要。目前应用广泛的JPEG Baseline编码和解码都是通过把像素分为Y,Cb,Cr三个颜色分量,以最小编码单元(MCU,Minimum Coding Unit)为基本单位从左到右从上到下进行扫描,对直流分量进行差分编码,对交流分量进行游程编码。由于数据相关性,采用上述传统的JPEG解码方式时,必须从码流的起点开始解码。而在显示端只需要显示部分图像的应用场景下,例如在平板电脑上浏览地图时,如果仍从码流的起点开始解码,则需要较长的解码时间,从而导致解码效率较低。

发明内容

[0003] 基于此,有必要针对传统的图像解码方法的解码效率较低的问题,提供一种JPEG图像解码方法和解码器。
[0004] 为实现本发明目的提供的一种JPEG图像解码方法,包括如下步骤:
[0005] 对与显示需求信号相应的整帧图像进行熵解码,建立相应的整帧索引表;其中,所述整帧索引表包括:所述整帧图像中每个索引单元对应的码流位置、第一直流分量以及第一复位序号;所述索引单元为所述整帧图像中固定间隔内包含预设个数的最小编码单元的集合;
[0006] 根据所述显示需求信号计算图像解码块大小,并根据计算得到的所述图像解码块大小分割所述整帧图像,确定所述整帧图像中与所述显示需求信号相应的实际显示区域;
[0007] 根据所述实际显示区域由所述整帧图像中选择相应的解码图像;并根据所述整帧索引表建立子图像索引表,同时对所述解码图像进行码流拼接;其中,所述子图像索引表包括:所述解码图像中每一行码流对应的码流偏移、码流长度、第二直流分量和第二复位序号;
[0008] 根据所述子图像索引表,对所述解码图像进行解码。
[0009] 在其中一个实施例中,所述对与显示需求信号相应的整帧图像进行熵解码,建立相应的整帧索引表,包括如下步骤:
[0010] 解析所述整帧图像的文件头,获取复位间隔;并设定固定间隔的当前索引单元中的最小编码单元个数为预设个数;
[0011] 由所述整帧图像的首行编码单元开始,按照从左到右的顺序依次对每个最小编码单元进行熵解码并计数;
[0012] 根据对所述最小编码单元的计数,记录每个所述索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置,以及每个所述索引单元的前一个索引单元中最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量,以及每个所述索引单元中第一个最小编码单元在直流信号复位周期中的序号;
[0013] 其中,每个所述索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置为所述整帧索引表中的码流位置;
[0014] 每个所述索引单元的前一个索引单元中最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量为所述整帧索引表中的第一直流分量;
[0015] 每个最小编码单元中的一个8x8大小的像素块为所述基本块;
[0016] 每个所述索引单元中第一个最小编码单元在直流信号复位周期中的序号为所述整帧索引表中的第一复位序号。
[0017] 在其中一个实施例中,所述根据所述显示需求信号计算图像解码块大小,并根据计算得到的所述图像解码块大小分割所述整帧图像,确定所述整帧图像中与所述显示需求信号相应的实际显示区域,包括如下步骤:
[0018] 根据所述显示需求信号,获取需要显示区域的坐标和缩放倍数;
[0019] 根据所述需要显示区域的坐标和缩放倍数,计算所述图像解码块大小;
[0020] 根据所述图像解码块大小分割所述整帧图像,确定所述整帧图像中与所述显示需求信号相应的实际显示区域。
[0021] 在其中一个实施例中,所述根据所述实际显示区域由所述整帧图像中选择相应的解码图像,包括如下步骤:
[0022] 分别以所述实际显示区域的上边界、下边界、左边界和右边界为基准,确定所述整帧图像中紧邻所述上边界的一组索引单元、紧邻下边界的一组索引单元、紧邻左边界的一组索引单元和紧邻右边界的一组索引单元;
[0023] 将紧邻左边界的一组索引单元与紧邻上边界的一组索引单元的交点对应的最小编码单元的左上角顶点像素点的坐标位置标记为(left,top),将紧邻右边界的一组索引单元与紧邻下边界的一组索引单元的交点对应的最小编码单元的右下角顶点像素点的坐标位置标记为(right,bottom);
[0024] 以所述坐标位置为(left,top)的像素点的横坐标为左边界,纵坐标为上边界,以所述坐标位置为(right,bottom)的像素点的横坐标为右边界,纵坐标为下边界围成的区域作为所述解码图像。
[0025] 在其中一个实施例中,所述根据所述整帧索引表建立子图像索引表,包括如下步骤:
[0026] 读取所述整帧索引表,获取紧邻所述解码图像左边界的索引单元对应的码流位置、第一直流分量以及第一复位序号,以及紧邻所述解码图像右边界的索引单元对应的码流位置;
[0027] 根据紧邻所述解码图像左边界的索引单元对应的码流位置,以及紧邻所述解码图像右边界的索引单元对应的码流位置,计算得到所述解码图像每一行码流对应的码流偏移和码流长度,作为子图像索引表中该行码流对应的码流偏移和码流长度;
[0028] 将所述解码图像每一行中紧邻所述解码图像左边界的索引单元对应的第一直流分量和第一复位序号分别作为子图像索引表中该行码流对应的第二直流分量和第二复位序号。
[0029] 在其中一个实施例中,所述根据紧邻所述解码图像左边界的索引单元对应的码流位置,以及紧邻所述解码图像右边界的索引单元对应的码流位置,计算得到所述解码图像中每一行码流对应的码流偏移和码流长度,包括如下步骤:
[0030] 初始化所述解码图像中首行码流导入数据存储模块的起始地址相对于整个数据存储模块的起始地址的偏移vbv_offset为0;
[0031] 以紧邻所述解码图像左边界的索引单元中第一个最小编码单元作为所述解码图像每一行的首部,根据公式:offset0=bitoffset0/8*8,计算得到每一行首部码流字节对齐偏移offset0;其中,bitoffset0为紧邻所述解码图像左边界的索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置;
[0032] 根据公式:bit_added=bitoffset0-offset0,计算每一行首部对齐增加的比特位bit_added;
[0033] 以紧邻所述解码图像右边界的索引单元中第一个最小编码单元的位置作为所述解码图像每一行的尾部,根据公式:offset1=(bitoffset8+7)/8*8,计算得到每一行尾部码流字节对齐偏移offset1;其中,bitoffset8为紧邻所述解码图像右边界的索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置;
[0034] 根据公式:imcu_bitlength=offset1-offset0,计算得到所述解码图像中每一行的码流长度imcu_bitlength;
[0035] 根据公式:imcu_offset=bit_added+vbv_offset,计算得到所述解码图像中每一行的码流偏移imcu_offset;
[0036] 对所述解码图像进行码流拼接。
[0037] 在其中一个实施例中,所述对所述解码图像进行码流拼接,包括如下步骤:
[0038] 由所述解码图像的首行码流开始,并由所述数据存储模块的起始地址作为初始导入位置,将所述解码图像每一行的码流以字节为单位导入所述数据存储模块中;
[0039] 判断当前行导入所述数据存储模块中的码流最后一个字节是否为0xFF;
[0040] 若是,则在当前行导入所述数据存储模块中的码流尾部增加一个0x00字节,并更新所述当前行的码流长度为:imcu_bitlength等于imcu_bitlength+8;
[0041] 根据公式:vbv_offset=vbv_offset+imcu_bitlength,计算下一行码流导入数据存储模块的起始地址相对于整个数据存储模块的起始地址的偏移;
[0042] 根据所述解码图像的全部码流导入所述数据存储模块状态,控制码流导入过程的状态。
[0043] 在其中一个实施例中,所述根据所述解码图像的全部码流导入所述数据存储模块状态,控制码流导入过程的状态,包括如下步骤:
[0044] 判断所述解码图像的码流是否全部导入所述数据存储模块;
[0045] 若是,则停止码流拼接修复;
[0046] 若否,则返回继续执行将所述解码图像每一行对应的区域的码流以字节为单位导入所述数据存储模块中的步骤。
[0047] 在其中一个实施例中,所述根据所述子图像索引表,对所述解码图像进行解码,包括如下步骤:
[0048] 实时判断所述解码图像中的当前行是否需要解码;
[0049] 当判断出所述解码图像中的当前行需要解码时,读取当前行对应的子图像索引表,由所述子图像索引表中获取当前行的码流对应的码流偏移、码流长度、第二直流分量和第二复位序号;
[0050] 根据解码图像中当前行的码流对应的码流偏移、码流长度、第二直流分量和第二复位序号,依次对当前行中每个索引单元中的最小编码单元进行熵解码;
[0051] 判断完成熵解码的当前最小编码单元是否为所述实际显示区域边界之外的最小编码单元;
[0052] 若是,则根据当前行是否为所述解码图像的最后一行,控制对所述解码图像的解码的状态;
[0053] 若否,则对所述当前最小编码单元进行反扫描、反量化、反变换、裁剪和缩放后得到相应的解码结果,并存储所述解码结果。
[0054] 相应的,本发明还提供了一种解码器,包括整帧索引表建立模块、实际显示区域确定模块、子图像索引表建立模块、子图像解码模块和数据存储模块;
[0055] 所述整帧索引表建立模块,被配置为对与显示需求信号相应的整帧图像进行熵解码,建立相应的整帧索引表;其中,所述整帧索引表包括:所述整帧图像中每个索引单元对应的码流位置、第一直流分量以及第一复位序号;所述索引单元为所述整帧图像中固定间隔内包含预设个数的最小编码单元的集合;
[0056] 所述实际显示区域确定模块,被配置为根据所述显示需求信号计算图像解码块大小,并根据计算得到的所述图像解码块大小分割所述整帧图像,确定所述整帧图像中与所述显示需求信号相应的实际显示区域;
[0057] 所述子图像索引表确定模块,被配置为根据所述实际显示区域由所述整帧图像中选择相应的解码图像;并根据所述整帧索引表建立子图像索引表,同时对所述解码图像进行码流拼接;其中,所述子图像索引表包括:所述解码图像中每一行码流对应的码流偏移、码流长度、第二直流分量和第二复位序号;
[0058] 所述子图像解码模块,被配置为根据所述子图像索引表,对所述解码图像进行解码;
[0059] 所述数据存储模块,被配置为存储所述整帧索引表和所述子图像索引表。
[0060] 在其中一个实施例中,所述整帧索引表建立模块包括解析设定单元和解码计数单元;所述数据存储模块包括第一存储单元;
[0061] 所述解析设定单元,被配置为解析所述整帧图像的文件头,获取复位间隔;并设定固定间隔的当前索引单元中的最小编码单元个数为预设个数;
[0062] 所述解码计数单元,被配置为由所述整帧图像的首行编码单元开始,按照从左到右的顺序依次对每个最小编码单元进行熵解码并计数;
[0063] 所述第一存储单元,被配置为根据对所述最小编码单元的计数,存储每个所述索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置,以及每个所述索引单元的前一个索引单元中最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量,以及每个所述索引单元中第一个最小编码单元在直流信号复位周期中的序号;
[0064] 其中,每个所述索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置为所述整帧图像中每个索引单元对应的码流位置;
[0065] 每个所述索引单元前一个索引单元中最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量为所述整帧图像中每个索引单元对应的第一直流分量;
[0066] 每个最小编码单元中的一个8x8大小的像素块为所述基本块;
[0067] 每个所述索引单元中第一个最小编码单元在直流信号复位周期中的序号为所述整帧图像中每个索引单元对应的第一复位序号。
[0068] 在其中一个实施例中,所述子图像索引表建立模块包括第一获取单元和第一计算单元;所述数据存储模块包括第二存储单元;
[0069] 所述第一获取单元,被配置为读取所述整帧索引表,获取紧邻所述解码图像左边界的索引单元对应的码流位置、第一直流分量以及第一复位序号,以及紧邻所述解码图像右边界的索引单元对应的码流位置;
[0070] 所述第一计算单元,被配置为根据紧邻所述解码图像左边界的索引单元对应的码流位置,以及紧邻所述解码图像右边界的索引单元对应的码流位置,计算得到所述解码图像每一行码流对应的码流偏移和码流长度,作为子图像索引表中该行码流对应的码流偏移和码流长度;
[0071] 所述第二存储单元,被配置为存储所述解码图像每一行中紧邻所述解码图像左边界的索引单元对应的第一直流分量和第一复位序号分别作为所述解码图像中每一行码流对应的第二直流分量和第二复位序号,以及所述解码图像每一行码流对应的码流偏移和码流长度作为所述子图像索引表。
[0072] 在其中一个实施例中,所述第一计算单元包括初始化子单元、首部偏移计算子单元、尾部偏移计算子单元、码流长度计算子单元和码流偏移计算子单元;
[0073] 所述初始化子单元,被配置为初始化所述解码图像中首行码流导入数据存储模块的起始地址相对于整个数据存储模块的起始地址的偏移vbv_offset为0;
[0074] 所述首部偏移计算子单元,被配置为以紧邻所述解码图像左边界的索引单元中第一个最小编码单元作为所述解码图像每一行的首部,根据公式:offset0=bitoffset0/8*8,计算得到每一行首部码流字节对齐偏移offset0;并根据公式:根据公式:bit_added=bitoffset0-offset0,计算每一行首部对齐增加的比特位bit_added;其中,bitoffset0为紧邻所述解码图像左边界的索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置;
[0075] 所述尾部偏移计算子单元,被配置为以紧邻所述解码图像右边界的索引单元中第一个最小编码单元的位置作为所述解码图像每一行的尾部,根据公式:offset1=(bitoffset8+7)/8*8,计算得到每一行尾部码流字节对齐偏移offset1;其中,bitoffset8为紧邻所述解码图像右边界的索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置;
[0076] 所述码流长度计算子单元,被配置为根据公式:imcu_bitlength=offset1-offset0,计算得到所述解码图像中每一行的码流长度imcu_bitlength;
[0077] 所述码流偏移计算子单元,被配置为根据公式:imcu_offset=bit_added+vbv_offset,计算得到所述解码图像中每一行的码流偏移imcu_offset。
[0078] 在其中一个实施例中,所述子图像索引表建立模块还包括码流修复单元;
[0079] 所述码流修复单元包括导入子单元、判断子单元和设置子单元;
[0080] 所述导入子单元,被配置为由所述解码图像的首行码流开始,并由所述数据存储模块的起始地址作为初始导入位置,将所述解码图像每一行的码流以字节为单位导入所述数据存储模块中;
[0081] 判断子单元,被配置为判断当前行导入所述数据存储模块中的码流最后一个字节是否为0xFF;
[0082] 设置子单元,被配置为所述判断子单元判断出当前行导入所述数据存储模块中的码流最后一个字节是0xFF时,在当前行导入所述数据存储模块中的码流尾部增加一个0x00字节,并更新所述当前行的码流长度为:imcu_bitlength等于imcu_bitlength+8;并根据公式:vbv_offset=vbv_offset+imcu_bitlength,设置下一行码流导入数据存储模块的起始地址相对于整个数据存储模块的起始地址的偏移;并根据所述解码图像的全部码流导入所述数据存储模块状态,控制码流导入过程的状态。
[0083] 在其中一个实施例中,还包括控制模块、熵解码模块、反扫描反量化模块、反变换模块和裁剪缩放模块;
[0084] 所述子图像解码模块包括实时判断单元、读取单元和越界判断单元;
[0085] 所述控制模块,被配置为控制所述熵解码模块、所述反扫描反量化模块、所述反变换模块、所述裁剪缩放模块和所述子图像解码模块的启动和停止;
[0086] 所述实时判断单元,被配置为实时判断所述解码图像中的当前行是否需要解码;
[0087] 所述读取单元,被配置为当所述实时判断单元判断出所述解码图像中的当前行需要解码时,读取所述数据存储模块中存储的当前行对应的子图像索引表,由所述子图像索引表中获取当前行的码流对应的码流偏移、码流长度、直流分量和复位序号;
[0088] 所述熵解码模块,被配置为根据当前行的码流对应的码流偏移、码流长度、第二直流分量和第二复位序号,依次对每个索引单元中的最小编码单元进行熵解码;
[0089] 所述越界判断单元,被配置为判断完成熵解码的当前最小编码单元是否为所述实际显示区域边界之外的最小编码单元;
[0090] 所述熵解码模块、所述反扫描反量化模块、所述反变换模块和所述裁剪缩放模块,分别被配置为当所述越界判断单元判断出所述当前最小编码单元为所述实际显示区域边界之内的最小编码单元时,对所述当前最小编码单元分别进行反扫描、反量化、反变换、裁剪和缩放,得到相应的解码结果;
[0091] 所述数据存储模块,还被配置为存储所述解码结果。
[0092] 上述图像解码方法的有益效果:
[0093] 其通过首先对与显示需求信号相应的整帧图像进行熵解码,建立相应的整帧索引表后,再根据显示需求信号确定整帧图像中相应的实际显示区域。进而,根据实际显示区域由整帧图像中选择相应的解码图像,并根据之前所建立的整帧索引表建立子图像索引表,对解码图像进行码流拼接修复。由此,在对图像进行解码时,只需根据最终所建立的子图像索引表对实际显示区域的图像进行解码即可。其实现了分块解码的目的,避免了对整帧图像的全部解码,因此节省了解码时间,提高了图像解码效率。最终有效解决了传统的图像解码方法的解码效率较低的问题。

附图说明

[0094] 图1为本发明的图像解码方法的一具体实施例的流程图;
[0095] 图2为本发明的图像解码方法的一具体实施例中的整帧图像示意图;
[0096] 图3为本发明的图像解码方法的一具体实施例中建立整帧索引表的流程图;
[0097] 图4为本发明的图像解码方法的一具体实施例中的整帧图像确定实际显示区域后的示意图;
[0098] 图5为本发明的图像解码方法的一具体实施例中根据整帧索引表对解码图像进行码流拼接的流程图;
[0099] 图6为本发明的图像解码方法的一具体实施例中根据子图像索引表对解码图像进行解码的流程图;
[0100] 图7为本发明的解码器的一具体实施例的结构示意图;
[0101] 图8为本发明的解码器的另一具体实施例的结构示意图。

具体实施方式

[0102] 为使本发明技术方案更加清楚,以下结合附图及具体实施例对本发明作进一步详细说明。
[0103] 首先应当说明的是,在本发明的图像解码方法中,最小编码单元(Minimum Coding Unit,简称MCU)指的是在JPEG中,把间隔编码的数据单元的最小组称为最小编码单元。其中,不同类型的图像,其最小编码单元对应的像素的宽和高不同。并且,最小编码单元可包含有多个基本块。该基本块指的是,每个最小编码单元中的一个8x8大小的像素块。
[0104] 索引单元(IMCU)则指的是,在整帧图像中所设置的固定间隔内包含预设个数的最小编码单元的集合。即,一个索引单元包含有预设个数的最小编码单元;而整帧图像则包含有多个索引单元。
[0105] 整帧索引表指的是,相对于整帧图像来说,所存储记录的整帧图像中每个索引单元对应的码流位置、第一直流分量以及第一复位序号等参数内容。
[0106] 其中,码流位置为:每一个索引单元中第一个最小编码单元的左上角顶点像素点对应Y分量在图像码流中的比特位置。
[0107] 第一直流分量为:每一个索引单元的前一个索引单元中最后一个最小编码单元的右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量。
[0108] 第一复位序号为:每一个索引单元中第一个最小编码单元在直流信号复位周期中的序号。
[0109] 相应的,子图像索引表则指的是,相对于由整帧图像中确定分割出来的解码图像来说,所存储记录的解码图像中每一行的码流对应的码流偏移、码流长度、第二直流分量和第二复位序号等参数内容。
[0110] 其中,码流偏移指的是,每次导入数据存储模块(可为闪存)中的码流在数据存储模块中的位置相对于数据存储模块的起始位置的偏移比特数。
[0111] 码流长度则指的是每次导入数据存储模块中的码流的比特长度。
[0112] 第二直流分量指的是,紧邻解码图像的左边界位置的索引单元的前一个索引单元中的最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量。即,子图像索引表中的第二直流分量指的是由整帧索引表中提取出来的紧邻解码图像左边界的索引单元对应的第一直流分量。
[0113] 第二复位序号指的是,由整帧索引表中所提取出来的紧邻解码图像左边界的索引单元中第一个最小编码单元在直流信号复位周期中的序号。
[0114] 参见图1,作为本发明的图像解码方法的一具体实施例,其包括如下步骤:
[0115] 步骤S100,对与显示需求信号相应的整帧图像进行熵解码,建立相应的整帧索引表。即,首先根据接收到的显示需求信号提取相应的整帧图像后,对整帧图像进行熵解码,获取整帧图像中每个索引单元对应的码流位置、第一直流分量以及第一复位序号,从而为后续建立子图像索引表提供相应的数据依据。
[0116] 其中,对整帧图像进行熵解码时,其可按照按从上到下从左到右的顺序,按最小编码单元进行熵解码。即,从整帧图像的左边界第一个最小编码单元开始进行解码并记录,每间隔预设个数的最小编码单元进行一次记录。如果右边界最后一个最小编码单元熵解码完毕,不够一个固定间隔计数时,则依然视作一个完整的间隔,并在下一行最小编码单元熵解码时重新进行固定间隔计数与记录。如:
[0117] 参见图2,以一副分辨率为160x160的420图像为例,一个最小编码单元(mcu)的大小为16x16。若以一个方格代表一个mcu,则一行有10个mcu,共10列。假设固定间隔的索引单元的预设个数(IMCU_NUM)设置为4,即每个索引单元(IMCU)中包含有4个最小编码单元(mcu)。则对该整帧图像的每一行来说,每间隔4个mcu记录一次,并且在最后一行最后一个mcu解码完成也需要记录一次。那么每行mcu序号为0~3为一组,4~7为一组,8~9为一组。其中,第一行序号为0的mcu所在的索引单元对应的第一直流分量(DC_Y,DC_Cb,DC_Cr)均记录为1024;其中,第十行序号为10的mcu记录内容只需要记录码流比特位置,并且该mcu所在的索引单元对应的第一直流分量(DC_Y,DC_Cb,DC_Cr)以及第一复位序号均记录为0。
[0118] 具体的,作为本发明的图像解码方法的一具体实施例,参见图3,首先执行步骤S110,解析整帧图像的文件头,获取复位间隔。然后执行步骤S111,设定固定间隔的当前索引单元中的最小编码单元个数为预设个数,从而实现整帧图像中的索引单元的建立。进而执行步骤S120,由整帧图像的首行编码单元开始,按照从左到右的顺序依次对每个最小编码单元进行熵解码并计数。然后,执行步骤S130,根据对最小编码单元的计数,记录每个索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在整帧图像的码流中的比特位置,以及每个索引单元的前一个索引单元中最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量,以及每个索引单元中第一个最小编码单元在直流信号复位周期中的序号。其通过对每个最小编码单元进行熵解码和计数,一方面可以避免遗漏和重复解码,另一方面还用于根据最小编码单元的计数,来选择存储记录相应的最小编码单元的码流位置、第一直流分量和第一复位序号作为索引单元对应的码流位置、第一直流分量和第一复位序号。
[0119] 其中,每个索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在整帧图像的码流中的比特位置为码流位置。每个索引单元的前一个索引单元中最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量为第一直流分量。每个索引单元中第一个最小编码单元在直流信号复位周期中的序号为第一复位序号。
[0120] 进一步的,参见图3,步骤S130,根据对最小编码单元的计数,记录每个索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在整帧图像的码流中的比特位置,以及每个索引单元的前一个索引单元中最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量,以及每个索引单元中第一个最小编码单元在直流信号复位周期中的序号,其具体可通过以下方式来实现。
[0121] 首先,通过执行步骤S131,根据当前最小编码单元的计数与预设个数的大小关系,判断当前索引单元(IMCU)中剩余最小编码单元(mcu)的个数是否为零。当判断出当前索引单元中剩余最小编码单元的个数为零时,表明此时当前索引单元中的所有最小编码单元均已进行完熵解码,且当前最小编码单元为当前索引单元中的最后一个最小编码单元。因此,执行步骤S132,计算当前索引单元中第一个最小编码单元在直流信号复位周期中的序号作为第一复位序号,并记录当前索引单元中的第一个最小编码单元左上角顶点像素点对应Y分量在整帧图像的码流中的比特位置,和当前最小编码单元(即当前索引单元的最后一个最小编码单元)中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量。即,将当前索引单元中的第一个最小编码单元的复位序号、当前索引单元的第一个最小编码单元的码流位置以及当前索引单元的前一个索引单元中的最后一个最小编码单元的第一直流分量作为当前索引单元的内容,存储至数据存储模块,以建立整帧索引表。
[0122] 当判断出当前索引单元中剩余最小编码单元的个数不为零时,则执行步骤S133,进一步判断当前最小编码单元是否为其所在的当前行的最后一个最小编码单元。这是因为,在整帧图像的每一行中,其按照固定间隔内包含预设个数的最小编码单元进行索引单元的划分时,每一行的最后一个索引单元中包含的最小编码单元的个数可能不是预设个数,而此时仍是按照一个索引单元来进行设置的。因此,当根据最小编码单元的计数与预设个数的大小关系判断出当前索引单元中剩余最小编码单元的个数不为零时,其有可能是位于行尾最后的一个最小编码单元。因此,还需要对当前最小编码单元是否为当前行的最后一个最小编码单元进行判断,以防止遗漏部分当前索引单元的存储内容。
[0123] 当判断出当前最小编码单元为当前索引单元最后一个最小编码单元或者为当前行的最后一个最小编码单元时,需要执行步骤S132,存储当前索引单元的内容,以保证所建立的整帧索引表数据的完整性和准确性。
[0124] 若通过执行步骤S131,判断出前索引单元中剩余最小编码单元的个数不为零,并通过执行步骤S133,判断出当前最小编码单元不是其所在的当前行的最后一个最小编码单元,则执行步骤S134,将当前索引单元中的剩余最小编码单元个数减1,并返回执行步骤S120,继续对当前最小编码单元的下一个最小编码单元进行熵解码并计数,直至整帧图像中所有的最小编码单元都解码完为止。
[0125] 另外,优选的,作为本发明的图像解码方法的一具体实施例,参见图3,其在执行完步骤S132,存储当前索引单元的第一个最小编码单元左上角顶点像素点对应Y分量在整帧图像的码流中的比特位置,和当前索引单元的前一个索引单元中最后一个最小编码单元右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量以及当前索引单元的第一个最小编码单元的在直流信号复位周期中的序号之后,还可通过执行步骤S135,判断当前最小编码单元是否为整帧图像的最后一个最小编码单元。若是,则执行步骤S136,增加存储一个索引单元对应的码流位置、第一直流分量和第一复位序号后完成整帧索引表的建立。其中,增加存储的索引单元对应的码流位置的取值设置为所述整帧图像的码流的比特长度加1,增加存储的索引单元的第一直流分量和第一复位序号的取值均设置为0。若否,则返回执行步骤S110,设定固定间隔的当前索引单元中的最小编码单元个数为预设个数。
[0126] 其通过设置对当前最小编码单元是否为整帧图像的最后一个最小编码单元的判断操作,确保了整帧图像的所有索引单元的全部熵解码,从而进一步的保证了所建立的整帧索引表的完整性和准确性。
[0127] 其中,需要说明的是,在步骤S120中,计算当前mcu在直流信号复位周期中的编码序号,可通过以下方式来实现。
[0128] 首先,根据公式:mcu_n=width/mcu_w,计算整帧图像每行中最小编码单元的个数mcu_n。其中,width为整帧图像的宽度;mcu_w为整帧图像中的一个最小编码单元对应像素的宽度。其中,不同类型的图像,其对应的mcu_w和mcu_h不同。具体来说,420类型图像mcu_w和mcu_h分别为16,16;422类型图像mcu_w和mcu_h分别为8,16;422T类型图像mcu_w和mcu_h分别为16,8;444类型图像mcu_w和mcu_h分别为8,8;411类型图像mcu_w和mcu_h分别为32,8;灰度类型图像mcu_w和mcu_h分别为8,8。
[0129] 进而,再根据公式:编码序号=x/mcu_w+y/mcu_h*mcu_n,计算获取当前最小编码单元的编码序号。其中,mcu_h为整帧图像中的一个最小编码单元对应像素的高度。x为:当前最小编码单元的左上角顶点像素点在整帧图像的坐标中的x轴取值。y为:当前最小编码单元的左上角顶点像素点在整帧图像的坐标中的y轴取值。
[0130] 最后,再根据计算得到的编码序号对复位间隔求余,计算得到余数。根据复位间隔减去所得到的余数得到的差值即为第一复位序号。
[0131] 当通过上述步骤建立整帧图像相应的整帧索引表后,进而执行步骤S200,根据显示需求信号计算图像解码块大小,并根据计算得到的图像解码块大小分割整帧图像,确定整帧图像中与显示需求信号相应的实际显示区域。
[0132] 其中,计算图像解码块大小具体可根据由显示端获取需要显示的图像区域的坐标和缩放倍数进行计算。即,首先通过执行步骤S210,根据显示需求信号,获取需要显示区域的坐标和缩放倍数。进而再执行步骤S220,根据需要显示区域的坐标和缩放倍数,计算图像解码块大小。最后,再通过执行步骤S230,根据图像解码块大小分割整帧图像,确定整帧图像中与显示需求信号相应的实际显示区域。
[0133] 其通过根据需要显示区域的坐标和缩放倍数计算得到图像解码块大小,进而再根据图像解码块大小对整帧图像进行分割,从而使得所确定的实际显示区域与现实需求信号相符合,且不会出现偏差。并且,在保证所确定的实际显示区域准确的同时,还简化了计算过程,从而节省了时间。
[0134] 待确定实际显示区域后,参见图1,进而再执行步骤S300,根据实际显示区域由整帧图像中选择相应的解码图像,并根据整帧索引表中所存储记录的每个索引单元对应的码流位置,第一直流分量和第一复位序号,建立子图像索引表。同时对解码图像进行码流拼接。从而在对解码图像进行解码时,只需根据子图像索引表中所存储记录的数据对解码图像进行解码即可。
[0135] 其中,在步骤S300中,根据实际显示区域由整帧图像中选择相应的解码图像时,其具体可根据实际显示区域的上边界、下边界、左边界和右边界进行选择。具体的:
[0136] 首先通过步骤S310,分别以实际显示区域的上边界、下边界、左边界和右边界为基准,确定整帧图像中紧邻上边界的一组索引单元、紧邻下边界的一组索引单元、紧邻左边界的一组索引单元和紧邻右边界的一组索引单元。
[0137] 进而再通过执行步骤S320,将紧邻左边界的一组索引单元与紧邻上边界的一组索引单元的交点对应的最小编码单元的左上角顶点像素点的坐标位置标记为(left,top),将紧邻右边界的一组索引单元与紧邻下边界的一组索引单元的交点对应的最小编码单元的右下角顶点像素点的坐标位置标记为(right,bottom)。
[0138] 最后再执行步骤S330,以坐标位置为(left,top)的像素点的横坐标为左边界,纵坐标为上边界,以坐标位置为(right,bottom)的像素点的横坐标为右边界,纵坐标为下边界围成的区域作为解码图像。
[0139] 参见图4,为更清楚的说明上述整帧图像中的解码图像的确定方案,以下以图4所示的整帧图像为例,对该整帧图像中的解码图像的确定过程作进一步详细说明。具体的:
[0140] 显示端需要显示的区域(即实际显示区域)为整帧图像中的SHOW_REGION部分(即,虚线框所围成的区域)。那么,首先以SHOW_REGION的左边界为基准,向左寻找最接近该左边界的一组IMCU单元,可知最小编码单元序号为0,1,2,3的这组IMCU最接近该左边界。然后以SHOW_REGION的上边界为基准,向上寻找最接近该上边界的一组IMCU单元行,可知第二行IMCU最接近该上边界(此处需要说明的是,该整帧图像中首行标记为第0行),所以将第二行IMCU中序号为0的最小编码单元的左上角顶点像素A的横纵坐标记为left,top。同理,以SHOW_REGION的右边界为基准,向右寻找最接近该右边界的一组IMCU单元,可知最小编码单元序号为8、9的这组IMCU最接近该右边界。然后以SHOW_REGION的下边界为基准,向下寻找最接近该下边界的一组IMCU单元行,可知第七行IMCU最接近该下边界,所以将第七行IMCU中序号为8的最小编码单元的左上角顶点像素B的横纵坐标记为right,bottom。由此可确定解码图像为图4中粗线框所在区域。
[0141] 通过上述分别以实际显示区域的上边界、下边界、左边界和右边界分别为基准,选择紧邻其上边界、下边界、左边界和右边界的索引单元组所确定的解码图像更加贴近于实际显示图像。从而最大程度的缩小了解码图像的范围。由此,当后续对解码图像进行码流拼接时,既保证了所导入的码流的准确性,同时还实现了最少量最完整的导入所需要的全部码流的目的。其不仅节省了后续建立子图像索引表的时间,同时还节省了存储容量。
[0142] 当确定解码图像之后,则需要根据所确定的解码图像和整帧索引表建立相应的子图像索引表。其中,作为本发明的图像解码方法的一具体实施例,建立子图像索引表可通过如下方式实现:
[0143] 首先通过执行步骤S340,读取整帧索引表,获取紧邻解码图像左边界的索引单元对应的码流位置、第一直流分量以及第一复位序号,以及紧邻所述解码图像右边界的索引单元对应的码流位置。由此来确定得到解码图像中的每行的首部和尾部的相关信息。
[0144] 如,参见图4,由根据图4所示的整帧图像相应的整帧索引表中查找获取解码图像(即粗线框围成的区域)每一行中序号为0的最小编码单元的记录内容,包括码流位置bitoffset0和第一复位序号mcu0,以及序号为7的最小编码单元记录的内容,包括第一直流分量DC_Y0、DC_Y0、DC_Y0。同时获取该解码图像每一行中序号为8的最小编码单元的记录内容,包括码流位置bitoffset8。
[0145] 进而执行步骤S350,根据紧邻解码图像左边界的索引单元中第一个最小编码单元的码流位置,以及紧邻解码图像右边界的索引单元中第一个最小编码单元的码流位置,计算得到解码图像每一行的码流偏移和码流长度。其中,计算码流偏移和码流长度具体可通过如下步骤实现:
[0146] 首先通过执行步骤S351,初始化解码图像中首行编码单元导入数据存储模块的起始地址相对于整个数据存储模块的起始地址的偏移为0。即,vbv_offset初始化为0。其中,vbv_offset指的是解码图像中首行编码单元导入数据存储模块的起始地址相对于整个数据存储模块的起始地址的偏移。
[0147] 然后,执行步骤S352,以紧邻解码图像左边界的索引单元中第一个最小编码单元的位置作为解码图像每一行的首部(如,图4中所示的解码图像每一行中序号为0的最小编码单元即为紧邻解码图像左边界的索引单元中第一个最小编码单元),根据公式:offset0=bitoffset0/8*8,计算得到每一行首部码流字节对齐偏移offset0。其中,bitoffset0为紧邻解码图像左边界的索引单元中第一个最小编码单元的码流位置。
[0148] 并通过执行步骤S353,根据公式:bit_added=bitoffset0-offset0,计算每一行首部对齐增加的比特位bit_added。
[0149] 进而再通过执行步骤S354,以紧邻解码图像右边界的索引单元中第一个最小编码单元的位置作为解码图像每一行的尾部(如,图4中所示的解码图像每一行中的序号为8的最小编码单元即为紧邻解码图像右边界的索引单元中第一个最小编码单元),根据公式:offset1=(bitoffset8+7)/8*8,计算得到每一行尾部码流字节对齐偏移offset1。其中,bitoffset8为紧邻解码图像右边界的索引单元中第一个最小编码单元的码流位置。
[0150] 最后,再根据上述步骤S352中计算得到的每一行首部码流字节对齐偏移offset0以及步骤S354中计算得到的每一行尾部码流字节对齐偏移offset1,通过步骤S355,根据imcu_bitlength=offset1-offset0,计算得到解码图像中每一行的码流长度imcu_bitlength。
[0151] 同时,通过步骤S356,根据公式:imcu_offset=bit_added+vbv_offset,计算得到解码图像中每一行的码流偏移imcu_offset。
[0152] 当通过上述步骤计算得到解码图像每一行的码流长度和码流偏移之后,需要将每一行最小编码单元的码流全部导入数据存储模块中进行存储,以备后续解码的需要。因此,可通过执行步骤S360,将解码图像每一行中紧邻解码图像左边界的索引单元对应的第一复位序号作为子图像索引表中的第二复位序号,和前一个索引单元对应的第一直流分量作为子图像索引表中的第二直流分量以及解码图像每一行的码流偏移和码流长度存储为子图像索引表。即,将序号为9的最小编码单元的第一直流分量DC_Y0、DC_Y0、DC_Y0和序号mcu0分别作为第二直流分量和第二复位序号存入子图像索引表中。其中,解码图像中第一行第一个索引单元前无索引单元,则其直流分量DC_Y0、DC_Y0、DC_Y0均初始化为1024。从而最终完成子图像索引表的建立。
[0153] 同时,还执行步骤S370,将解码图像每一行对应区域的码流以字节为单位导入数据存储模块中,并进行码流修复。
[0154] 其中,将解码图像每一行对应区域的码流以字节为单位导入数据存储模块中时,可通过执行步骤S371,由解码图像的首行编码单元开始,并由数据存储模块的起始位置作为初始导入位置,将所述解码图像每一行对应的区域的码流以字节为单位导入数据存储模块中。即,将解码图像中首行的offset0至offset1之间的码流从数据存储模块的vbv_offset位置(起始位置)开始导入,然后进行码流修复。
[0155] 并且,参见图5,在执行步骤S371,将解码图像每一行的码流以字节为单位导入数据存储模块中的同时,需要对所导入的码流进行修复。具体的:
[0156] 首先通过执行步骤S372,判断当前行导入数据存储模块中的码流最后一个字节是否为0xFF。若是,则执行步骤S373,在当前行导入数据存储模块中的码流尾部增加一个0x00字节,并更新当前行的码流长度为:imcu_bitlength等于imcu_bitlength+8。并更新vbv_offset=vbv_offset+imcu_bitlength,计算下一行码流导入数据存储模块的起始地址相对于整个数据存储模块的起始地址的偏移。
[0157] 若否,则执行步骤S374,根据解码图像的全部码流导入数据存储模块状态,控制码流导入过程的状态。
[0158] 其中,参见图5,在步骤S374,根据解码图像的全部码流导入数据存储模块状态,控制码流导入过程的状态时,具体可通过步骤S3741,判断解码图像的码流是否全部导入数据存储模块来实现。当判断出解码图像的码流全部导入数据存储模块时,则表明此时解码图像的码流已全部进行拼接修复完毕,因此直接停止码流拼接修复即可。当判断出解码图像的码流还未全部导入数据存储模块,则返回执行步骤S340,将解码图像每一行对应的区域的码流以字节为单位导入数据存储模块中,直至解码图像的码流全部导入数据存储模块。其不仅保证了解码图像码流的完整性和准确性,同时还为后续对解码图像进行解码时提供了完整准确的原始码流数据,从而保证了后续解码的准确性和完整性。
[0159] 待通过上述步骤建立解码图像相应的子图像索引表并将解码图像的码流全部进行拼接修复导入至数据存储模块中后,需要对解码图像进行解码从而最终获取实际显示区域的图像。即此时则需要执行步骤S400,根据子图像索引表,对解码图像进行解码。
[0160] 其中,参见图6,根据子图像索引表对解码图像进行解码时,其具体可通过以下步骤来实现:
[0161] 首先由步骤S410,实时判断解码图像中的当前行是否需要解码。如果需要进行解码,则执行步骤S420,读取当前行对应的子图像索引表,由子图像索引表中获取当前行的码流对应的码流偏移、码流长度、直流分量和复位序号。如果判断出当前行不需要进行解码,表明此时当前行已经解码完毕。因此,为了避免重复解码,则执行步骤S430,判断当前行是否为解码图像的最后一行。如果是,则表明解码图像的所有行全部解码完毕,直接输出最终得到的实际显示区域的图像即可。如果不是,则继续执行步骤S410,判断解码图像中的当前行的下一行是否需要解码,以保证解码图像中的所有行均进行解码,从而保证最终得到的实际显示区域的准确性和完整性。
[0162] 其中,当通过执行步骤S420,由子图像索引表中获取当前行码流对应的码流位置、码流长度、直流分量和复位序号后,则直接执行步骤S440,根据当前行的码流对应的码流位置、码流长度、直流分量和复位序号,依次对当前行中每个索引单元中的最小编码单元进行熵解码,以实现对当前行的解码操作。
[0163] 同时,当通过执行步骤S440,对当前行的每个最小编码单元进行熵解码完毕后,需要执行步骤S450,对解码完毕的当前最小编码单元处于实际显示区域的具体位置进行判断,以保证当前行的每一个最小编码单元都已进行过熵解码的同时,还能够避免对处于实际显示区域边界之外的最小编码单元的处理操作,从而避免了不必要的最小编码单元的解码,进一步节省了解码时间,提高了解码效率
[0164] 其中,步骤S450,对解码完毕的当前最小编码单元的具体位置进行判断时,可通过对完成熵解码的当前最小编码单元是否为无效最小编码单元和冗余最小编码单元来实现。其中,以图4所示的整帧图像为例,无效最小编码单元可为位于实际显示区域(SHOW_REGION)边界左边的最小编码单元,如:每行中序号为0和1的最小编码单元均为无效最小编码单元。冗余最小编码单元则为位于实际显示区域(SHOW_REGION)边界右边的最小编码单元,如:每行中序号为7的最小编码单元为冗余最小编码单元。
[0165] 具体的,参见图6,可首先通过步骤S451,判断完成熵解码的当前最小单元是否为无效最小编码单元。若是,则表明此时的当前最小编码单员为位于实际显示区域左边界之外的最小编码单元,不需要对其进行进一步处理。因此,直接执行步骤S430,根据出当前行是否为解码图像的最后一行,控制对解码图像的解码的状态。若否,则表明此时的当前最小编码单元并不位于实际显示区域的左边界之外。但是还需要对其是否为位于实际显示区域的右边界之外的最小编码单元进行判断。因此,此时需要执行步骤S452,进一步判断当前最小编码单元是否为冗余最小编码单元。若是,则表明此时的当前最小编码单元为位于实际显示区域的右边界之外的最小编码单元,其仍不需要进行进一步的处理。因此可直接执行步骤S430,根据出当前行是否为所述解码图像的最后一行,控制对解码图像的解码的状态。若否,则表明此时的当前最小编码单元既不是无效最小编码单元,也不是冗余最小编码单元。即,此时的当前最小编码单元为位于实际显示区域范围之内的最小编码单元。因此,可执行步骤S460,对当前最小编码单元进行反扫描、反量化、反变换、裁剪和缩放后得到相应的解码结果,并存储解码结果。
[0166] 应当说明的是,对完成熵解码的当前最小编码单元进行具体位置的判断时,其也可通过首先判断其是否为冗余最小编码单元再进一步判断其是否为无效最小编码单元来实现。其判断原理相同,此处不再赘述。
[0167] 其中,参见表1,分别为采用传统的图像解码方法和本发明提供的图像解码方法对两幅分辨率为2592x1936与3264x2448典型应用场景下的图片,在显示端需要输出1024x1024大小的区域,并且缩放2倍的条件下进行解码时的解码时间对比:
[0168] 表1
[0169]
[0170] 其中,软解码为传统的图像解码方法,硬解码则为本发明提供的图像解码方法。由表1可明显得出,本发明的图像解码方法相较于传统的图像解码方法,其解码速度提升至少一倍以上,解码性能明显提高,且随着解码图像分辨率越大,其差别越明显。
[0171] 通过上述任一所述的图像解码方法,能够实现快速高效的图像解码,其不需要对整帧图像进行全部解码,只需根据显示需求信号由所建立的子图像索引表对实际显示区域进行解码即可。其不仅实现了分块解码的目的,同时还达到了能够实现硬件分块解码的效果。尤其适用于解码分辨率较大的图像。
[0172] 相应的,本发明还提供了一种解码器。由于本发明提供的解码器的工作原理与本发明提供的图像解码方法的原理相同或相似,因此重复之处不再赘述。
[0173] 参见图7,作为本发明的解码器100的一具体实施例,其包括整帧索引表建立模块110、实际显示区域确定模块120、子图像索引表建立模块130、子图像解码模块140和数据存储模块150。其中:
[0174] 整帧索引表建立模块110,被配置为对与显示需求信号相应的整帧图像进行熵解码,建立相应的整帧索引表。其中,整帧索引表包括:整帧图像中每个索引单元对应的码流位置、第一直流分量以及第一复位序号;索引单元为整帧图像中固定间隔内包含预设个数的最小编码单元的集合。
[0175] 实际显示区域确定模块120,被配置为根据显示需求信号计算图像解码块大小,并根据计算得到的图像解码块大小分割整帧图像,确定整帧图像中与显示需求信号相应的实际显示区域。
[0176] 子图像索引表确定模块,被配置为根据实际显示区域由整帧图像中选择相应的解码图像;并根据整帧索引表建立子图像索引表,同时对解码图像进行码流拼接;其中,子图像索引表包括:解码图像中每一行码流对应的码流偏移、码流长度、第二直流分量和第二复位序号。
[0177] 子图像解码模块140,被配置为根据子图像索引表,对解码图像进行解码。
[0178] 数据存储模块150,被配置为存储整帧索引表和子图像索引表。
[0179] 本发明提供的解码器100对图像进行解码过程中,通过所建立的子图像索引表,不需要解码整帧图像,只需根据显示需求信号采用硬件解码,由所建立的子图像索引表解码相应的实际显示区域即可。由此其节省了大量的解码时间,从而有效的提高了解码效率,最终提升了用户体验。
[0180] 其中,需要说明的是,参见图8,作为本发明提供的解码器100的一具体实施例,整帧索引表建立模块110包括解析设定单元和解码计数单元(图中均未示出)。数据存储模块150包括第一存储单元(图中未示出)。
[0181] 解析设定单元,被配置为解析整帧图像的文件头,获取复位间隔;并设定固定间隔的当前索引单元中的最小编码单元个数为预设个数。解码计数单元,被配置为由整帧图像的首行编码单元开始,按照从左到右的顺序依次对每个最小编码单元进行熵解码并计数。第一存储单元,被配置为根据对最小编码单元的计数,存储每个索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在整帧图像的码流中的比特位置,以及每个索引单元的前一个索引单元中最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量,以及每个索引单元中第一个最小编码单元在直流信号复位周期中的序号。其中,每个索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置为所述整帧图像中每个索引单元对应的码流位置。每个索引单元的前一个索引单元中最后一个最小编码单元中右下角基本块的左上角顶点像素点对应的Y分量的直流分量、Cb分量的直流分量和Cr分量的直流分量为整帧图像中每个索引单元对应的第一直流分量。每个索引单元中第一个最小编码单元在直流信号复位周期中的序号为整帧图像中每个索引单元对应的第一复位序号。
[0182] 另外,子图像索引表建立模块130包括第一获取单元和第一计算单元。相应的,数据存储模块150包括第二存储单元。其中:
[0183] 第一获取单元,被配置为读取所述整帧索引表,由所述整帧索引表中获取所述解码图像每一行中,紧邻所述解码图像左边界的索引单元对应的码流位置、第一直流分量以及第一复位序号,以及紧邻所述解码图像右边界的索引单元对应的码流位置。第一计算单元,配置为根据紧邻所述解码图像左边界的索引单元对应的码流位置,以及紧邻所述解码图像右边界的索引单元对应的码流位置,计算得到所述解码图像每一行码流对应的码流偏移和码流长度。第二存储单元,被配置为存储所述解码图像每一行中紧邻所述解码图像左边界的索引单元对应的第一直流分量和第一复位序号分别作为所述解码图像中每一行码流对应的第二直流分量和第二复位序号,以及所述解码图像每一行码流对应的码流偏移和码流长度作为所述子图像索引表。
[0184] 进一步的,第一计算单元包括初始化子单元、首部偏移计算子单元、尾部偏移计算子单元、码流长度计算子单元和码流偏移计算子单元。其中,初始化子单元,被配置为初始化解码图像中首行编码单元导入数据存储模块150的起始地址相对于整个数据存储模块150的起始地址的偏移vbv_offset为0。首部偏移计算子单元,被配置为以紧邻所述解码图像左边界的索引单元中第一个最小编码单元作为所述解码图像每一行的首部,根据公式:
offset0=bitoffset0/8*8,计算得到每一行首部码流字节对齐偏移offset0;并根据公式:
bit_added=bitoffset0-offset0,计算每一行首部对齐增加的比特位bit_added;其中,bitoffset0为紧邻所述解码图像左边界的索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置。尾部偏移计算子单元,被配置为以紧邻所述解码图像右边界的索引单元中第一个最小编码单元的位置作为所述解码图像每一行的尾部,根据公式:offset1=(bitoffset8+7)/8*8,计算得到每一行尾部码流字节对齐偏移offset1;其中,bitoffset8为紧邻所述解码图像右边界的索引单元中第一个最小编码单元左上角顶点像素点对应Y分量在所述整帧图像的码流中的比特位置。码流长度计算子单元,被配置为根据公式:imcu_bitlength=offset1-offset0,计算得到解码图像中每一行的码流长度imcu_bitlength。码流偏移计算子单元,被配置为根据公式:imcu_offset=bit_added+vbv_offset,计算得到解码图像中每一行的码流偏移imcu_offset。
[0185] 更进一步的,作为本发明的解码器100的一具体实施例,其子图像索引表模块130还包括码流修复单元。具体的,码流修复单元包括导入子单元、判断子单元和设置子单元(图中未示出)。
[0186] 其中,导入子单元,被配置为由解码图像的首行编码单元开始,并由数据存储模块150的起始位置作为初始导入位置,将解码图像每一行的码流以字节为单位导入数据存储模块150中。判断子单元,被配置为判断当前行导入数据存储模块150中的码流最后一个字节是否为0xFF。设置子单元,被配置为第一判断子单元判断出当前行导入数据存储模块150中的码流最后一个字节是0xFF时,在当前行导入数据存储模块150中的码流尾部增加一个
0x00字节,并更新当前行的码流长度为:imcu_bitlength等于imcu_bitlength+8;并更新vbv_offset=vbv_offset+imcu_bitlength,设置下一行码流导入数据存储模块的起始地址相对于整个数据存储模块的起始地址的偏移。根据解码图像的全部码流导入数据存储模块150状态,控制码流导入过程的状态。
[0187] 优选的,参见图8,作为本发明的解码器100的一具体实施例,其还包括控制模块160、熵解码模块170、反扫描反量化模块180、反变换模块190和裁剪缩放模块200。同时,子图像解码模块140包括实时判断单元、读取单元和越界判断单元。其中:
[0188] 控制模块160,被配置为控制熵解码模块170、反扫描反量化模块180、反变换模块190、裁剪缩放模块200和子图像解码模块140的启动和停止。实时判断单元,被配置为实时判断解码图像中的当前行是否需要解码。读取单元,被配置为当实时判断单元判断出解码图像中的当前行需要解码时,读取数据存储模块150中存储的当前行对应的子图像索引表,由所述子图像索引表中获取当前行的码流对应的码流偏移、码流长度、直流分量和复位序号。熵解码模块170,被配置为根据当前行的码流对应的码流偏移、码流长度、直流分量和复位序号,依次对每个索引单元中的最小编码单元进行熵解码。越界判断单元,被配置为判断完成熵解码的当前最小编码单元是否为实际显示区域边界之外的最小编码单元。熵解码模块170、反扫描反量化模块180、反变换模块190和裁剪缩放模块200,分别被配置为当越界判断单元判断出当前最小编码单元为实际显示区域边界之内的最小编码单元时,对当前最小编码单元分别进行反扫描、反量化、反变换、裁剪和缩放,得到相应的解码结果。数据存储模块150,还被配置为存储解码结果。
[0189] 以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。