具体实施方式
为使对本发明的目的、构造特征及其功能有进一步的了解,配合附图详细说明如下:
本发明公开一种数字图像数据的可逆压缩方法,可用于对二维数字图像进行无失真的压缩和解压缩。请首先参考图1,为本发明的数字图像数据的压缩方法流程图。首先需要选择参考行(步骤101);然后,逐一比较该参考行与当前行未编码部分相应位置的数据,以在未编码部分查找出第一个差异数据段(步骤102);从该当前差异数据段的起始位置前的数据开始查找与从该当前差异数据段起始位置开始向后的数据的最大匹配数据段(步骤103);根据匹配情况,确定待压缩数据类型(步骤104);根据待压缩数据类型,确定待压缩数据段类型及其相关参数(步骤105);最后,根据待压缩数据段类型和相关参数,进行相应的编码处理(步骤106)。
当第一个差异数据段处理完毕以后,如果尚未到达当前行的行尾,则应以当前编码结束位置的下一个位置起始继续查找当前行和参考行之间的下一个差异数据段,并重新执行所述匹配及编码步骤,直至将整个当前行的数据处理完毕;然后,再以下一行作为当前行,重新从所述选择参考行步骤开始执行,直至将整幅图像处理完毕。
上述选择参考行的步骤,如果当所压缩的行是图像的第一行时,系统提供一个全零行作为参考行。
选择参考行可以有多种方法,例如:可以在当前行和当前行以上的若干行的固定位置进行数据抽样;然后,将当前行的抽样数据与其它行的抽样数据进行比较;最后,将与当前行的抽样数据匹配度最高的行作为参考行。
还可以:设置一个固定长度的数据窗(数据窗的长度应该稍长,如32个字节);然后,将该数据窗沿着当前行和当前行以上的若干行滑动;最后,如果当前行落在该数据窗内的数据与另外一行相应位置的数据相等,则选择该行为当前行。
如果有一行以上的行满足选择参考行的条件,则选择距离当前行最近的行作为参考行。
上述确定第一个差异数据段的步骤,是首先将当前行未编码部分与参考行的对应位置的数据逐一进行比较;然后将第一个差异数据的位置记录为差异数据段的起始位置;继续进行比较,直到当前行与参考行对应位置出现相同数据或遇到行尾;最后将该位置记录为差异数据段的结束位置。
请参阅图2,为本发明的数字图像数据的解压缩方法流程图。首先,确定当前行的参考行以及当前行的数据,(对于下面公开的方案一的解压缩处理,需要先将参考行的内容复制到当前行;对于方案二的解压缩处理,则是直接对当前行的数据进行改写)(步骤201);然后,将写入点定位在当前行的行首(步骤202);接着,读入一个编码(步骤203);取得该编码的数据类型及相关参数(步骤204);根据该数据类型及相关参数译码数据(步骤205)。
在没有到达编码数据的行尾时,则继续读入下一个编码并确定新的当前写入点;然后,根据该编码的数据类型和相关参数,重新执行所述译码数据步骤,直至将该行编码全部处理完毕;接着,以下一行为当前行,重新从确定当前行的参考行开始执行,直至将整幅图像还原。
下面以一具体的图像数据片断来说明本发明。请参阅图3,为本发明具体实施例的某一高清晰度图像的数据片段以及从其中选择参考行的示意图。该高清晰度图像的数据片段,其宽度为128象素,高度为4行。如果我们选择抽样4个数据要求其中3个数据相等的话,图3中的第4行就应该选择第1行作为参考行。
请参见图4,为本发明中在当前行中查找第一个差异数据段的具体实施例示意图。假设当前行为第3行,参考行为第2行时,将当前行与参考行的对应位置的数据逐一进行比较,如果发现对应位置的数据不同,则将当前行这个数据的位置记录为差异数据段的起始位置,然后继续进行比较过程,直到当前行与参考行对应位置出现相同的数据或遇到行尾时,记录当前行的这个数据的位置为刚刚被记录的差异数据段的结束位置。也就是说通过这一步找出第一个当前行与参考行之间不同的差异数据段。如图4所示,当前行与参考行之间第一个差异数据段为从第8个数据0x3E开始到第九个数据0x03结束的两个字节。
在对该差异数据段进行匹配时,是在当前行该差异数据段前面的数据中查找和该差异数据段从第一个数据起匹配长度最长的数据串。需要注意的是,这里在查找最大长度的匹配数据串时,以差异数据段的第一个数据开始,但并不受限于该差异数据段的结束位置,而是受限于当前行的结束位置,即在当前行内能匹配多长就匹配多长。如果匹配长度超出该差异数据段的结束位置,则超出的这部分数据可能与参考行对应位置的数据相同也可能与参考行对应位置的数据不同。这样做的好处在于当当前行与参考行之间的下一个差异数据段恰好包括在第一个差异数据段的最大长度匹配数据串中时,第二个差异数据段便不需要再被编码了。
这种情况可以用图5a来示意。在查找到当前行和参考行之间第一个差异数据段后,在其前面的7个数据中查找最大匹配。这里最大匹配从第5个数据开始,长度为7。虽然两行之间尚有两个数据段不同,但是都不需要再被编码了。
最大匹配长度分为以下几种情况:
如果最大匹配数据段长度为零,即该差异数据段第一个数据是在当前行中第一次出现,则将该第一个数据跳过,该差异数据段的起始位置移至第二个数据的位置,以此形成的新的当前差异数据段重新执行所述匹配步骤。如果匹配的结果始终为零,且遇到该差异数据段的结束位置,则分析前面跳过的数据,对其尝试进行缩位编码,如果不能进行缩位编码,则确定其为第一类型数据(以下称:文本数据),如果可以进行缩位编码,则确定其为第二类型数据(以下称:可缩位数据)。
如果最大匹配数据段的长度不为零且大于或等于该差异数据段的长度(如图5a所示)。这时,先检查是否存在有跳过而未被编码的数据,若存在,则对其尝试进行缩位编码,以确定是属于文本数据还是可缩位数据;然后把该差异数据段在前面的数据中的匹配位置、匹配长度等参数信息编码为第三类型数据(以下称:复制当前行数据),以当前编码结束的位置的下一个位置起始继续查找当前行和参考行之间的下一个差异数据段。在图5a中数据段长度为2,最大匹配长度为7。
如果最大匹配数据段的长度不为零且小于该数据段的长度,如图5b所示,这时,先检查是否存在跳过而未被编码的数据,若存在,则对其尝试进行缩位编码,以确定是属于文本数据还是可缩位数据;然后将该差异数据段中的匹配部分在前面数据中的匹配位置、匹配长度等信息编码为复制当前行数据类型;然后,差异数据段的起始位置移至匹配部分的下一个数据的位置,以此新差异数据段重新执行所述匹配步骤。
如图5b中所示,当差异数据段的起始位置移至0xE0后,由于0xE0没有可匹配数据,这时跳过这个数据,但已经到该数据段的结尾,所以将刚刚跳过的数据0xE0尝试进行缩位编码,然后当前行数据位置移至下一个数据0x3C,重新从查找下一个差异数据段开始执行。
本发明中缩位编码的原理基于下列事实:
在二维数字图像数据中存在数据分布的不均匀性。在实践中发现,某些固定的数据组合出现的比例比其它的组合高很多。这些固定的数据组合符合以下规律:
在一个有N位宽的数据中,若将连续出现的1记为一段,连续出现的0也记为一段(如1 1 1 1 1 0 0 0中有两段),在实践中发现,在一个有N位宽的数据中,连续出现1的段数与连续出现0的段数的和不大于2的数据出现的频率比其它情况高很多,即很少有很多1和0交替出现的情况(如1 1 0 10 1 1 0)。对于一个有N位宽的数据(N是2的整数次幂),这种数据组合共有2×N个。我们可以把所有2N个N位数据中的这2×N个数据编码成位宽为Log2(2×N)=Log2N+1的2×N个标志码。这样,我们就可以在很大概率范围内将LZ77认为不可压缩的数据在保持长度不变甚至减少的情况下加入到压缩后的数据中,大大弥补了LZ77在处理不可压缩数据方面的缺陷,提高了压缩比。需要说明的是,以上方法包括将一个长类型的数据拆分成几个短类型数据的情况。例如将一个16位宽的数据拆分成2个8位的数据进行编码或4个4位的数据进行编码以满足概率分布不同的场合的要求。
举例来说(为简短起见,这里举由4个二进制位构成的数据),在二维的数字图像数据中,试验发现90%以上的数据分布在
{0 0 0 0,0 0 0 1,0 0 1 1,0 1 1 1,1 1 1 1,1 1 1 0,11 0 0,1 0 0 0}的范围内。我们可以将这八个数据分别用八个代码来表示,如用0 0 0表示0 0 0 0,用0 0 1表示0 0 0 1,用0 1 0表示0 0 1 1,用0 1 1表示0 1 1 1,用1 0 0表示1 1 1 1,用1 0 1表示1 1 1 0,用1 1 0表示1 1 0 0,用1 1 1表示1 0 0 0,则对一个字节来说,可以省出两位来记录这是一个缩位编码。这样,原来需要多增加一个字节来表示的数据,现在可以做到不增加。而一个字节编码的成功率取决于其高四位和低四位数据都落在可编码范围内的几率(0.9×0.9=81%)。
例如在上述匹配步骤中跳过的数0xE0,可以被这样编码:
0xE0写成二进制形式为1 1 1 0 0 0 0 0,如果按照上面的编码方式,1 1 1 0用1 0 1表示,0 0 0 0用0 0 0来表示,则缩位结果为1 0 1 00 0。若以两位数字0 0来表示缩位格式编码的话,0xE0就可以被编码为00 1 0 1 0 0 0,即0x28。
根据编码方案的需要,还可以将所述第一差异数据段前面的未编码数据,也就是和参考行对应位置的数据相同的当前行数据,确定为第四类型数据(以下称:复制参考行数据)。
连续的同类型待压缩数据即可组成一该类型的待压缩数据段。
具体的编码方案根据参数的选择可以有所不同,下面仅举两个编码方案作为例子说明:
方案一:经过上述压缩编码后,整个当前行的数据被分成三类进行编码:
1、第一编码数据:即对第一类型数据段编码为文本格式(Literal Format),表示用LZ77,DeltaRow,缩位均不能压缩的数据,其数据格式为:
第一编码标记 |
定位点位移量 |
复制数量 |
该数据段内的原始数据 |
2、第二编码数据:即对第二类型数据段编码为缩位格式(CondensedFormat),表示用本发明中缩位原理可以压缩的数据,其数据格式为:
3、第三编码数据:即对第三类型数据段编码为复制当前行格式(CurrentLine Copy Format),表示用LZ77原理可以压缩的数据,其数据格式为:
第三编码标记 |
定位点位移量 |
复制数量 |
复制目标所在位置 |
在压缩数据段时,记录有当前压缩的数据段与上一数据段压缩结尾点(即所谓“定位点”)之间的位移量(Anchor Offset)。在解压时,先将参考行完全复制到当前行,然后再对当前行进行修改来得到新的一行。由于对当前行与参考行之间的对应位置相同的数据我们不作处理,所以存在解压缩时怎样将已还原的数据段正确定位的问题。若正在压缩的数据段是当前行的第一个数据段,则定位点在当前行的行首。在数据段被压缩完之后,定位点移至此数据段的结尾点。在解压缩时,首先将写入点定位在当前行的行首,然后读入一个编码,取得其Anchor Offset,写入点向前加Anchor Offset得到当前写入点。每写一个数据,写入点向前移一个数据,当一个数据段写完后,写入点正好移到数据段的结尾点。然后重复前面的步骤直至将一行数据完全解压。
方案二:经过上述压缩编码后,整个当前行的数据被分成四类进行编码:
1、第一编码数据:即对第一类型数据段编码为文本格式(Literal Format),表示用LZ77,DeltaRow,缩位均不能压缩的数据,其数据格式为:
2、第二编码数据:即对第二类型数据段编码为缩位格式(CondensedFormat),表示用本发明中缩位原理可以压缩的数据,其数据格式为:
3、第三编码数据:即对第三类型数据段编码为复制当前行格式(CurrentLine Copy Format),表示用LZ77原理可以压缩的数据,其数据格式为:
4、第四编码数据:即对第四类型数据段编码为复制参考行格式(ReferenceLine Copy Format),表示与参考行同一位置完全相同的数据,其数据格式为:
上述复制目标所在位置是指复制目标的数据段起始位置与当前位置的偏移量。
下面,我们将图7中所给出的图像片段按照上述方案二进行压缩。具体的压缩格式如下:
1、文本格式(Literal Format):
请参见图6a,这里的00为文本编码标记,复制数量(Copy Count)为跟在本字节后的字节数-1(Copy Count不可能为0),由于只有6位宽,所以最多可以跟63个文本字节(Copy Count为62,即0x3E)。若文本字节多于63个(如65),则在本字节后再加一个字节(0x01)以表示实际字节数-64,而将Copy Count域记为63(0x3F)。然后跟上实际个数的文本字节。
2、缩位格式(Condensed Format):
请参见图6b,这里的01为缩位编码标记,Code 1为3位的缩位编码1,Code 2为3位缩位编码2。
3、复制当前行格式(Current Line Copy Format):
请参见图6c,这里的10为复制当前行编码标记,复制数量(Copy Count)为要从当前行复制的字节数-1(Copy Count不可能为0),复制偏移量(CopyFrom)为要复制位置与当前位置的偏移量。由于复制数量(Copy Count)域只有3位宽,所以最多可以表示复制7个字节(Copy Count域为6)。若多于7个字节(如9个字节),则在本字节后再加一个字节(0x01)以表示实际复制字节数-8,而将复制数量Copy Count域记为7。同理复制偏移量(Copy From)域也可以用多加字节的方法来解决位宽的限制问题。
4、复制参考行格式(Reference Line Copy Format):
请参见图6d,其中11为复制参考行编码标记,复制数量(Copy Count)为要从参考行复制的字节数-1(Copy Count不可能为0),由于只有6位宽,所以最多可以表示63个字节(Copy Count为62,即0x3E)。若要复制的字节多于63个(如65),则在本字节后再加一个字节(0x01)以表示实际要复制的字节数-64,而将复制数量(Copy Count)域记为63(0x3F)。
图7中的第0行为系统提供的全零参考行。按照上述第二方案的编码格式进行编码的结果为(二进制形式):
1:11 000000 01 010 110 01 000 010 01 110 000 01 001 11001 000 011 10 000 011 10 010 110 10 101 011
2:01 110 000 01 010 101 11 000000 01 101 000 10 010 01101 011 101 01 000 011 10 001 110 10 001 011 10 010 110
3:11 000110 10 110 011 11 000001
4:11 000011 10 001 011 01 101 000 11 001000
写成十六进制形式为:
1:C0 56 42 70 4E 43 83 96 AB
2:70 55 C0 68 93 5D 43 8E 8B 96
3:C6 B3 C1
4:C3 8B 68 C8