发明内容
本发明的目的在于提供一种用于嵌入式系统的渐进模式JPEG图像分段解码方法,能够只利用较少的内存资源和相对较低的运算量就能正常解码Progressive JPEG图像,并能够应用到嵌入式系统中。
本发明的目的通过以下的技术措施来实现:一种用于嵌入式系统的渐进模式JPEG图像分段解码方法,将JPEG图像分割成一个以上的区域,获取待解码区域的定位信息和解码状态信息,每次从JPEG图像所含的每一个扫描scan中各解码一个区域段数据,并叠加得到该区域对应的经过量化的DCT变换系数,再经过反量化和IDCT变换,得到该区域所对应的一段JPEG图像。
本发明具体包括以下步骤:
(1)根据系统内存的大小将JPEG图像分割成一个以上的区域,在JPEG图像所含的每一个scan中按分割的区域相同分布;
(2)获取并保存JPEG图像的各种信息,获取并保存各个scan的扫描起始(Start of Scan)段信息,初始化待解码数据在各个scan中的起始位置定位信息与解码状态信息;
(3)获取当前区域待解码数据在各个scan中的起始位置定位信息,同时获取解码状态信息;
(4)对当前区域里每个scan中的Huffman编码数据进行解码,并将所得到的经过量化的DCT系数叠加到缓冲区;
(5)将缓冲区中的数据进行反量化与IDCT变换,得到当前区域所对应的图像;
(6)保存下一区域待解码数据在各个scan中的起始位置定位信息和解码状态信息;
(7)重复步骤3~6直到所有区域都解码完成。
本发明将JPEG图像分割的每个区域包含一个或多个MCU行,每一个区域的所包含的MCU行数是固定相同,或是变化。
本发明使用分段解码Progressive JPEG的方法,每次从多个scan中各解码一段数据,最终组合成一段JPEG图像用于显示,只需要分配一小块内存缓冲区即可满足要求,避免了常用的Progressive JPEG解码方法中需要整幅图片大小的内存缓冲区的缺陷,从而大大降低了对内存资源的要求。此外,由于不需要对每个scan的数据都重复进行反量化和IDCT变换的过程,大大降低了对运算量的需求。
具体实施方式
下面结合附图和具体实施方式对本发明做进一步的说明。
如图1所示,首先,要根据具体需求与环境(如可用的嵌入系统内存大小),将JPEG图像划分成一系列区域,每个区域包含一个或多个MCU(Minimum Code Unit,最小编码单元)行。假设JPEG图像包含两个Scan(分别为Scan1和Scan2),每个Scan均包含15个MCU行。如图2所示,将JPEG图像划分为4个区域:第一个区域包含MCU行1~4,第二个区域包含MCU行5~8,第三个区域包含MCU行9~12,第四个区域包含MCU行13~15。每一个区域的所包含的MCU行数可以是固定的,也可以是变化的,可根据实际需要,例如可用内存大小来确定。
然后,需要获取并保存JPEG图像的各种信息,包括图像尺寸、采样信息、Huffman表、量化表等,以及各个scan的起始位置定位信息和解码状态信息,如:色彩分量数目、色彩分量编号、Huffman表格编号、Ss和Se(Start/End ofSpectral Selection)、Ah和Al(Successive Approximation Bit PositionHigh/Low)、EOBRUN(End of Band Run Length)、DC系数基准值等等。
图3是基于DCT变换编码的JPEG文件结构示意,其中,SOI与EOI分别表示图像文件的开始与结束。由图3可知,JPEG文件可以包括多个scan,在所有scan之前有一个Frame Header(帧头部),也可以包含表格及相关信息(可选);在每一个scan的开头,包含一个Scan Header(也可以包含表格及相关信息),随后是Huffman编码的数据,以MCU为单位按顺序排列。
JPEG文件包含若干个segment(分段),每个segment开头都有一个2字节的标识,被称作segment marker(分段标识),随后跟着相关的参数,也可以不包含任何参数,仅存在segment marker(例如SOI和EOI就是这样)。图4给出了SOS段的结构,其中Ls表示SOS段的长度,Ns表示当前scan中编码的图像分量数目;Csi是图像分量的索引号,Tdi是DC系数Huffman码表的索引号,Tai是AC系数Huffman码表的索引号;Ss是Spectral Selection的起始序号,Se是SpectralSelection的结束序号;Ah表示Successive Approximation,Al表示。
JPEG文件中的表格及相关信息,以及各个SOS段的信息都是解码时必需的,因此需要将其保存起来。此外,还需要初始化定位信息,即是第一个区域的待解码数据在各个scan中的起始位置(如图2中“起始位置1”所示),以及解码过程中所需的一些状态信息(如DC分量基准值、EOBRUN值等)。
准备好各种所需的信息之后,就可以对当前区域按照scan的顺序依次进行Huffman解码了。在图2所示例子中,当对区域1进行解码时,先解码scan1的MCU行1~4,所得系数存放在缓冲区中,然后解码scan2的MCU行1~4,并将系数叠加存放到缓冲区中,因此,只需要对应于4个MCU行的缓冲区即可。
解码完当前区域之后,需要保存各个scan的定位信息,在图2的例子中,若对区域1进行解码,完成后需要保存scan1和scan2的“起始位置2”信息,同时也要保存解码过程中的状态信息,这些信息是解码下一个区域所需的。
至此,就完成了从一个区域的各个scan中解码出Huffman编码数据,并将系数叠加存放到缓冲区的过程。由于缓冲区的尺寸对应于区域的尺寸,而不是对应于整幅图像的尺寸,所以,可以根据需要选择合适的区域大小(即MCU行数),以适应各种内存受限的应用。
Huffman解码得到的系数是经过量化的DCT系数,因此,对缓冲区中的数据进行反量化与IDCT变换,即可得到当前区域所对应的图像,然后根据实际应用的需要进行处理,如:将这一段图像送至显示设备进行显示,或将其保存到存储设备上等等。
上述步骤完成了一个区域的JPEG图像解码,如果还有区域需要解码,首先需要获取待解码区域的定位信息和解码状态信息,然后重复前面所述的解码过程即可,也即:逐个scan进行Huffman解码,保存定位信息和解码状态信息,进行反量化与IDCT变换,将所得图像按需要进行处理。
所有区域处理完毕后,整幅JPEG图像的解码过程就完成了。
在本发明中,进行叠加的数据是各个对各个scan经过Huffman解码后得到的量化DCT系数,而不是典型的Progressive JPEG解码器中经过Huffman解码、反量化和IDCT变换后所得的图像数据,但是两种方式最终解码所得的图像却是一致的,这是DCT变换的特性所决定的,下面给出数学推导予以验证。
基于DCT变换模式的JPEG图像中,编码过程是对8×8的图像数据矩阵进行FDCT变换,得到8×8的DCT变换系数矩阵,而解码过程则是对8×8的DCT变换系数矩阵进行IDCT变换,得到8×8的图像数据矩阵。
FDCT变换与IDCT变换是一对互逆的变换过程,其数学表示如下:
FDCT:
IDCT:
其中,
将上述公式表示为矩阵形式:
FDCT:
IDCT:
其中,8×8的矩阵
和
分别表示DCT变换系数矩阵与原始图像数据矩阵,8×8的矩阵C可表示为:
0≤x,u≤7(6)
根据矩阵运算的规则,有:
(7)
这里,
表示未切割成多个scan的原始图像数据,
表示切割成多个scan后的图像数据,
表示未切割成多个scan的原始图像数据所对应的DCT变换系数,
表示各个scan所对应的DCT变换系数。可见,本发明中对DCT变换系数进行叠加
然后再进行IDCT变换的方式,与典型的Progressive JPEG解码器中对IDCT变换后的图像数据进行叠加
的方式,二者所得的结果是一致的,但无论Progressive JPEG文件中存在多少个scan的数据,本发明中的方法都只需要进行一次IDCT变换,而会不像典型的Progressive JPEG解码器那样,随着scan数目的增加IDCT变换的运算量线性增长,因此大大降低了对运算量的需求。
本发明适用嵌入式系统应用中的Progressive JPEG图像解码。