一种基于Huffman表的数据处理方法
技术领域
本发明涉及一种数据处理方法,尤其涉及一种基于Huffman表的数据处理方法。
背景技术
传统的图像编码技术也称为第一代编码技术,主要有预测编码、变换编码、信息嫡编码与矢量量化。预测编码和变换编码是当前图像编码器最常用的技术,预测和变换的主要目的是降低图像原始空间域表示中存在的强相关性,使得预测或变换后的数据矩阵变成弱相关性矩阵,这样可以用标量量化和嫡编码进行有效的压缩。信息嫡编码是一种无失真编码,常用的有哈夫曼编码(Huffman Coding)、游程长度编码(Run Length Coding)和算术编码(Arithmetic Coding)三种。
传统的Huffman编码算法需要对原始数据进行两遍扫描:第一遍扫描要精确地统计出原始数据中每个值出现的频率,利用得到的频率创建Huffman树,并将树的有关信息保存起来,便于解压时使用;第二遍扫描根据前面得到的Huffman树对原始数据进行编码,并将编码信息存储起来。
在JPEG文件中,每个Huffman树的表示形式如图1所示:开始的16个字节是每个级别的数据的个数,本文称为数目区。紧接着的是对应的数据,本文成为数据区,一个数据一个字节,字节数是开始16个字节的字节之和。数据区按照数目区的顺序依次排列,直到结束。在解码的时候首先依次读取数目区的一个字节,得到对应的区段的数据数目,然后再依次将数据区中对应的数据添加到对应深度二叉树中,***优先为左侧分支。再编码的时候是解码的逆向过程。
JPEG的图片数据是bit流的形式,每组可处理的数据由两部分组成,一个是Huffman查询码,一个是数据值,所有这些都按照字节流紧密排列。每部分的bit数目不定。
基于所述Huffman树的构建包括首先构建一个二叉树节点,具体如下:
其中,各成员变量的意义如下:L_child:该节点的左侧分支;R_child:该节点的右侧分支;ch:该节点的数据;IsLeaf:该节点是否是叶节点;若无左右分支,用来标志是不是数据节点,即存放数据的,如果不是叶节点则为中继节点,即无有效数据,只是向下一层查找的支持节点。
采用上述方法构建出来的Huffman树的示例如图2所示。其中,对应的其对应的JPEG数据如下表一所示。
表一
下面是解码的步骤:
1、首先读取数目区第一个字节,数值为0,表明第一层无数据。
2、读取数目区的第二个字节,数值为1,表明第二层有一个数据,则为Root Node构建一个左子节点,该节点是第一层的,所以还需为该节点再构建一个左子节点,并填入数据区第一个字节的数值,设置该节点状态为叶节点。
3、读取数目区的第三个字节,数值为2,则接着读取数据区的两个字节,数值依次为6和7。依旧从根节点开始,采用前序遍历,创建第三层的第一个节点,并设置其数值为6,状态为叶节点;接着再按照前序遍历的规则,增加第三层的第二个节点,设置数值为7,状态为叶节点。注意遍历的时候碰到叶节点则递归返回其他的树。
4、读取数目区的第四个字节,数值为0,表明第四层无数据。
5、读取数目区的第五个字节,数值为2,则接着读取数据区的两个字节,数值依次为22和29。采用类似与第3步中的方法,为第五层添加两个叶节点。
6、后续的字节均为0,即不用再添加叶节点了。
但是,现有技术在JPEG编解码时,使用二叉树的方式来编解码Huffman表时,代码实现复杂、出错几率高、代码调试复杂。
发明内容
现有技术在JPEG编解码时,使用二叉树的方式来编解码Huffman表时,代码实现复杂、出错几率高、代码调试复杂。
为解决上述问题,本发明提供一种基于Huffman表的数据处理方法,包括:基于Huffman表构建二叉树数组,并基于所述二叉树数组进行解码。
可选的,所述二叉树数组为二维数组,第一维是二叉树的层数,第二维是每层的节点数。
可选的,所述节点的初始状态为无效,一个节点包括一个字节或两个字节,所述一个字节用以保存数据或保存状态;所述两个字节用以保存数据和保存状态。
可选的,所述二叉树的层数为16。
可选的,提供数目区及数据区,所述数目区内的字节与所述数据区内对应层数据的数目对应。
可选的,包括:依次读取数目区的字节,获得该字节对应层的数据的数目:若当前读取数目区的字节为0,则继续读取位于数目区内的下一个字节;若当前读取的字节为非0,则计算当前层的初始查询码,并读取数据区的数据。
可选的,所述计算当前层的初始查询码包括:根据当前层与第一层的层数差值,将全局查询码左移相应的层数差值,并保存为当前层的初始查询码。
可选的,包括:读取所述数据区的当前数据后,对应保存至所述二维数组中对应当前层的节点。
可选的,保存当前数据至所述二维数组的当前层后,则对应查询码加1
可选的,所述基于所述二叉树数组进行解码包括:读取图片数据,获取节点查询码,并根据所述二维数组的层数和节点查询码,对应定位至所述二维数组中的对应节点:若对应位置数据有效,则为叶节点,则当前查询结束;若否,则继续读取图片数据。
可选的,所述定位包括:所述对应节点的位置序号为查询码-当前层初始查询码。
可选的,读取图片数据中的当前bit,作为节点查询码。
可选的,若当前位置数据无效,则读取所述图片数据中下一个bit,与前面一个bit组成2bit的查询码,在进行位置定位;若2bit的查询码对应的节点有效,则本次查询结束;如果无效,则继续读取图片数据中下一个bit,与前面的查询码结合组成,形成多一个bit的查询码,再次定位,直到查询码处理完毕。
可选的,所述查询码的总数为16bit。
与现有技术相比,本发明具有以下优点:本方法采用数组方式,避免容易出错的指针及树的操作,且编码相对更加简单,调试时更是比二叉树方式更加直观简单。执行速度快,数据规整,数据结构清晰,提高调试的效率。
附图说明
图1所示为JPEG文件中的Huffman表的表示形式示意图;
图2为采用二叉树构建形成的Huffman表的结构示意图;
图3为本发明一个实施例的二叉树数组的构建方法流程示意图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本发明。但是本发明能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本发明内涵的情况下做类似推广,因此本发明不受下面公开的具体实施的限制。
其次,本发明利用示意图进行详细描述,在详述本发明实施例时,为便于说明,所述示意图只是实例,其在此不应限制本发明保护的范围。
现有技术在JPEG编解码时,使用二叉树的方式来编解码Huffman表时,代码实现复杂、出错几率高、代码调试复杂。
本发明提供一种基于Huffman表的数据处理方法,包括:基于Huffman表构建二叉树数组,并基于所述二叉树数组进行解码。其中,所述二叉树数组为二维数组,第一维是二叉树的层数,第二维是每层的节点数。所述二叉树的层数为16。
最开始的状态时,所述节点的初始状态为无效,一个节点包括一个字节或两个字节,所述一个字节用以保存数据或保存状态;所述两个字节用以保存数据和保存状态。即每个节点最多包括两个字节,一个用于保存数据,一个用于保存状态。
构建所述二叉树数组前包括提供数目区及数据区,所述数目区内的字节与所述数据区内对应层数据的数目对应。依次读取数目区的字节,获得该字节对应层的数据的数目:若当前读取数目区的字节为0,则继续读取位于数目区内的下一个字节;若当前读取的字节为非0,则计算当前层的初始查询码,并读取数据区的数据。
读取所述数据区的当前数据后,对应保存至所述二维数组中对应当前层的节点。并且在保存当前数据至所述二维数组的当前层后,则对应查询码加1。
其中,所述计算当前层的初始查询码包括:根据当前层与第一层的层数差值,将全局查询码左移相应的层数差值,并保存为当前层的初始查询码。
对应的,所述基于所述二叉树数组进行解码包括:读取图片数据,获取节点查询码,并根据所述二维数组的层数和节点查询码,对应定位至所述二维数组中的对应节点:若对应位置数据有效,则为叶节点,则当前查询结束;若否,则继续读取图片数据。其中,所述对应节点的位置序号为查询码-当前层初始查询码。所述查询码的总数为16bit。
读取图片数据中的当前bit,作为节点查询码。若当前位置数据无效,则读取所述图片数据中下一个bit,与前面一个bit组成2bit的查询码,在进行位置定位;若2bit的查询码对应的节点有效,则本次查询结束;如果无效,则继续读取图片数据中下一个bit,与前面的查询码结合组成,形成多一个bit的查询码,再次定位,直到查询码处理完毕。
下面结合具体的实施例对本发明的基于Huffman表的构建和解码进行详细描述。
如图3所示,作为一个实施例,所述二叉树数组的生成方法可以分为以下6步骤,具体如下:
1、比较Number Bytes数目区中的各字节数值,获取所述数目区中字节数最大的值。
2、生成二维数组,所述二维数组中的一维是二叉树的层数,另一维是每层的节点数,即为第一步中得到的Number Bytes数目区中的各字节数值。作为一个实施例,所述二叉树的层数即一维大小确定为16。
进一步地,生成所述二维数组时,同时设置各节点状态为无效。设置全局查询码初始为0。一个节点最多只占用2个字节,一个保存数据,一个保存状态。
3、读取Number Bytes数目区中的第一个字节,获得该一层的数据数目。如果值为0,则继续读取Number Bytes下一个字节;如果值不为0,则进入4。
4、根据3获取的数据数目,进而获取层数差值,计算本层的初始查询码。具体地,将全局查询码左移相应的位数,并保存为该层初始查询码。
5、读取Data Bytes数据区中第一个字节,保存进二维数组中对应该层的第一个节点,全局查询码加1。
6、依次读取下一个字节,处理方法同5,直到全部该层的数据全部读取完毕。接着进入3。
经过上述步骤,二叉树对应数组建立起来了。
接着,解码时二叉树数组的使用方法包括:在解码时,首先读取图片数据中的一个bit,并作为节点查询码,根据位数(即层数)和查询码的数值,定位到二维数组中的对应节点,位置序号为“查询码-该层初始查询码”,如果对应位置为数据有效,则为叶节点,本次查询结束;如果对应位置数据无效,则读取图片数据中下一个bit,与前面一个bit组成2bit的查询码,在进行位置定位,如果节点有效,则本次查询结束,如果无效,则再读取图片数据中下一个bit,与前面的查询码结合组成又多一个bit的查询码,再次定位。如此,直到16位的查询码都处理完毕,如果此时仍未找到有效节点,证明解码出错或文件数据错误,结束解码。
此方法的空间消耗与二叉树的结构关系很大,如果树的数据按层次平均分布,那么该方案将比二叉树实现更节省空间,如果树的数据集中在某一层次,那其空间消耗将会增加。
假设数据的数目为N,而各层数据最大数目为M,那么根据登时10*N=2*16*M,得到N:M=32:10,所以当总数目与层最大数目大于4时,数组方法将节省空间,在3-4之间时,两种方法相当,当小于3的时候,二叉树的方法较节省空间。因此整体而言,该方法均比二叉树的方法节省空间。
而且理解该方法需要对JPEG编码及相应编解码过程有深入了解。优点是编码简单,执行速度也很快。而且该方法数据规整,数据结构清晰,对提高调试的效率也有较大的好处。
本发明虽然已以较佳实施例公开如上,但其并不是用来限定本发明,任何本领域技术人员在不脱离本发明的精神和范围内,都可以利用上述揭示的方法和技术内容对本发明技术方案做出可能的变动和修改,因此,凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化及修饰,均属于本发明技术方案的保护范围。