发明内容
本发明的目的在于克服现有技术存在的缺陷,在保证压缩率的同时,提高解码速度。
为实现以上目的,本发明采用一种图像无损压缩方法,包括如下步骤:
获取原始图像;
采用算术编码方法计算原始图像的残差,并统计出残差中每个符号出现的次数,并存入数组counts[];
根据数组counts[],循环组建出霍夫曼树,并使用限制长度的方法,对霍夫曼树各个叶节点进行编码,得到霍夫曼编码表;
利用霍夫曼编码表对原始图像的残差进行压缩,得到编码数据以供解码处理。
进一步地,所述采用算术编码方法计算原始图像的残差,并统计出残差中每个符号出现的次数,并存入数组counts[],包括:
采用线性模型,基于所述原始图像上编码的像素位置,对待编码的值进行预测,得到待编码像素的预测值pred(X);
根据待编码像素的预测值pred(X)和待编码像素X,计算所述原始图像的残差;
统计出残差中每个符号出现的次数,并存入数组counts[]。
进一步地,所述采用线性模型,基于所述原始图像上编码的像素位置,对待编码的值进行预测,得到待编码像素的预测值,包括:
判断所述待编码像素X的位置;
若所述待编码像素X为所述原始图像的首行像素的首像素,则所述待编码像素X的预测值pred(X)=0;
若所述待编码像素X为所述原始图像的非首行像素的首像素,则所述待编码像素X的预测值pred(X)=B,B为X的上一行最近邻像素值;
若所述待编码像素X为所述原始图像的剩余位置像素,则所述待编码像素X的预测值pred(X)=A,A为X的左最近邻像素值。
进一步地,所述根据待编码像素的预测值和待编码像素,计算所述原始图像的残差,包括:
利用所述待编码像素真实值减去所述待编码像素的预测值,得到所述原始图像的残差Rp=X-pred(X);
令所述原始图像的残差Rp为Rm,Rm=(X-pred(X))mod2N;
进一步地,所述根据数组counts[],循环组建出霍夫曼树,并使用限制长度的方法,对霍夫曼树各个叶节点进行编码,得到霍夫曼编码表,包括:
根据数组counts[],循环组建出所述霍夫曼树,并统计所述霍夫曼树各个叶节点的bit长度;
使用限制长度的方法,对霍夫曼树各个叶节点进行编码,重新分配各个叶节点的bit长度;
对重新分配bit长度的各个叶节点分配编码,得到霍夫曼编码表。
进一步地,所述利用霍夫曼编码表对原始图像的残差进行压缩,得到编码数据以供解码处理,包括:
利用所述霍夫曼编码表对所述原始图像的残差进行压缩,得到所述编码数据;
对所述霍夫曼编码表进行压缩,得到压缩后的编码表;
利用压缩后的编码表和编码数据进行解码。
进一步地,所述对所述霍夫曼编码表进行压缩,得到压缩后的编码表,包括:
结合ZSTD算法和游程编码,对所述霍夫曼编码表进行压缩,得到压缩后的编码表。
进一步地,还包括:
预先在线下训练得到所述霍夫曼编码表,并利用霍夫曼编码表对原始图像的残差进行压缩,得到编码数据以供解码处理。
进一步地,所述预先在线下训练得到所述霍夫曼编码表,包括:
按行读取训练数据,并以一行数据作为一个训练样本;
对所述训练样本计算其残差;
判断所述训练样本的残差是否只有一个符号;
若是,则将所述训练样本去除;
若否,则将所述训练样本保留,并计算保留下来的训练样本的残差符号出现的次数,存入数组counts[256];
将数组counts[256]的所有值加1并归一化数组counts[256];
根据数组counts[256],预先计算出所述霍夫曼编码表。
另一方面,采用一种图像无损压缩系统,包括:获取模块、算术编码模块、文本编码模块和解码模块;
获取模块用于获取原始图像;
算术编码模块用于采用算术编码方法计算原始图像的残差,并统计出残差中每个符号出现的次数,并存入数组counts[];
文本编码模块用于根据数组counts[],循环组建出霍夫曼树,并使用限制长度的方法,对霍夫曼树各个叶节点进行编码,得到霍夫曼编码表;
解码模块用于利用霍夫曼编码表对原始图像的残差进行压缩,得到编码数据以供解码处理。
与现有技术相比,本发明存在以下技术效果:由于单一的一类无损压缩算法无法兼顾压缩率和解码速度,本发明提出融合算术编码和通用文本压缩方法的无损压缩方法,首先使用算术编码算法对原始图像进行残差计算,然后使用霍夫曼编码压缩残差,实现在保障压缩率的同时,拥有通用文本方法的解码速度,且本方案采用受限制长度的霍夫曼编码,可方便向FPGA移植。
具体实施方式
为了更进一步说明本发明的特征,请参阅以下有关本发明的详细说明与附图。所附图仅供参考与说明之用,并非用来对本发明的保护范围加以限制。
如图1所示,本实施例公开了一种图像无损压缩方法,包括如下步骤S1至S4:
S1、获取原始图像;
需要说明的是,该原始图像为一行图像数据或多行图像数据RowSymbols。
S2、采用算术编码方法计算原始图像的残差,统计出残差中每个符号出现的次数,并存入数组counts[];
S3、根据数组counts[],循环组建出霍夫曼树,并使用限制长度的方法,对霍夫曼树各个叶节点进行编码,得到霍夫曼编码表;
S4、利用霍夫曼编码表对原始图像的残差进行压缩,得到编码数据以供解码处理。
需要说明的是,本实施例中选用的通用文本方法是受限制长度的霍夫曼编码(LLHF:Length-Limited Huffman code),算术编码方法采用SFALIC(Simple Fast andAdaptive Lossless Image Compression Algorithm),SFALIC是FELICS(Fast andEfficient Lossless Image Compression)的改进算法,它通过随机更新模型的方法来加快编解码的速度,但是压缩率只有轻微的下降。表1是SFALIC与FELICS的指标比对,可见SFALIC的速度比较与FELICS,在解码速度上提升了一倍。
表1:在50份网络下载的自然数据集上,得到的实验结论,其压缩和解压速度数据是50份图像的平均值
方法 |
压缩率 |
解压速度 |
FELICS |
1.88 |
65MB/s |
SFALIC |
1.84 |
138MB/s |
SFALIC是算术编码方法,它先计算残差并对残差数据进行相关性操作,使残差数据满足指数下降分布。而这种分布特性,使得使用通用文本方法压缩成为可能。实验证明,采用SFALIC算法对原始图像进行残差的计算,然后使用霍夫曼编码压缩残差的这种方法使得在对行像素是2048并按行压缩时,通用文本方法的压缩率由1.0~1.20上升到压缩率为1.80左右。
进一步地,上述步骤S2:采用算术编码方法计算原始图像的残差,统计出残差中每个符号出现的次数,并存入数组counts[],包括如下细分步骤S21至S23:
S21、采用线性模型,基于所述原始图像上编码的像素位置,对待编码的值进行预测,得到待编码像素的预测值pred(X);
需要说明的是,SFALIC选用线性模型进行预测待编码的值,根据编码的像素位置不同,会分为3种情况,得到三种预测的模型如下:
1)若所述待编码像素X为所述原始图像的首行像素的首像素,则所述待编码像素X的预测值pred(X)=0。
2)如图2所示,若所述待编码像素X为所述原始图像的非首行像素的首像素,则所述待编码像素X的预测值pred(X)=B,B为X的上一行最近邻像素值也就是上一行的首像素值;
3)如图3所示,若所述待编码像素X为所述原始图像的剩余位置像素,则所述待编码像素X的预测值pred(X)=A,A为X的左最近邻像素值即当前像素值的左边的像素值,通常一个像素有4个近邻的像素,分别位于当前像素的上下左右,左最近邻像素指的就是左边的像素。
S22、根据待编码像素的预测值pred(X)和待编码像素X,计算所述原始图像的残差;
S23、统计出残差中每个符号出现的次数,并存入数组counts[]。
进一步地,上述步骤S22:根据待编码像素的预测值pred(X)和待编码像素X,计算所述原始图像的残差,具体包括如下细分步骤S221至S223:
S221、利用所述待编码像素真实值减去所述待编码像素的预测值,得到所述原始图像的残差Rp=X-pred(X);
S222、令所述原始图像的残差Rp为Rm,Rm=(X-pred(X))mod2N;
S223、令为R
m为R,
以使残差满足指数下降分布。
其中,N是图像每一个像素的Bit数,即位深度,通常N=8~16,8表示一个像素占一个字节,16表示一个像素占有两个字节。
需要说明的是,由残差R
p的计算公式可得知,R
p的取值范围是
为了能继续使用N bits编码这个范围,令:R
m=(X-pred(X))mod2
N,这个式子表示如果残差是负数,那么就会加上2
N,如果是正数,那么值不变。这种变换会改变残差的概率分布,使得概率分布不再满足指数下降趋势,如下图4所示,其中图4-(a)表示未变换前的残差R
p的概率分布图,图4-(b)表示变换后的残差R
m的概率分布图。对于解压,使用X=(R
m+pred(X))mod2
N,还原出原始的值。
由于经过上述残差变换后,残差Rm不再满足指数下降的概率分布,为了能使残差继续满足指数下降分布,将图4-(b)中2N-1的右边部分镜像移动到左边,变换后,概率分布发生改变,即令:
使得R满足如下图5所示的概率分布,由图5可见,R的概率分布明显符合指数下降规律,从而适合使用Golomb-Rice编码。
进一步地,上述步骤S3:根据数组counts[],循环组建出霍夫曼树,并使用限制长度的方法,对霍夫曼树各个叶节点进行编码,得到霍夫曼编码表,包括如下细分步骤S31至S33:
S31、根据数组counts[],循环组建出所述霍夫曼树,并统计所述霍夫曼树各个叶节点的bit长度;
S32、使用限制长度的方法,对霍夫曼树各个叶节点进行编码,重新分配各个叶节点的bit长度;
S33、对重新分配bit长度的各个叶节点分配编码,得到霍夫曼编码表。
需要说明的是,本实施例在采用SFALIC算法计算原始图像的残差后,使用霍夫曼编码压缩残差,得到编码数据。霍夫曼编码利用霍夫曼树进行编码,其具体思想是尽量用短的bits来表示概率最高也就是文本中出现次数较多的符号。例1是一个简单的构建霍夫曼编码例子。
例1:使用霍夫曼编码下述文本符号:
{0,0,0,0,0,0,0,0,0,0,0,0,
2,2,2,2,2,2,2,2,2,
4,4,4,4,4,4,
8,8,8,8,
16,32,33,34}
它由12个0,8个2,6个4,4个8和分别1个的16,32,33,34组成。首先将概率最小的符号中的任意两个组成一个节点,如图6所示。组成的新节点A,其符号出现的次数P=1+1=2;将此节点看成一个新的符号重新加入到文本符号表中;再次选择文本符号表中的33,34组成一个新的节点B。
此时的文本符号表变成12个8,8个2,6个4,4个8和分别是2个的A和B。再次选择符号出现次数最小的A和B组成新节点C,C由A、B组成其子叶,如图7所示。
依次选择最小的符号这样类推,直到所有的符号分配完成,形成一个霍夫曼树如图8所示。
如果霍夫曼树左树枝用bit=1来表示,右树枝用bit=0来表示,那么最终得到的编码如表2所示:
表2
0 |
2 |
4 |
8 |
16 |
32 |
33 |
34 |
10 |
11 |
01 |
001 |
00000 |
00001 |
00010 |
00011 |
观察霍夫曼编码符号16、32、33、34,其值是递增1,同样同一层的符号0、2、4也是这个特点,如果求出某一层的数值开始编码值Val,这一层的所有叶节点的编码值就是Val依次加1,那么就能够有一种简单的编码方式,其计算开始值如下:
输入:treeLenth:树的高度,即层的个数
void CreateCodes(treeLenth)
统计每一层的叶节点个数,到数组perRankNum[]
从霍夫曼树的底部开始,计算自增的初始值,保存到数组perRankVal[]
startValue=0;
for n=treeLenth:1;
per RankVal[n]=startValue;
startValue=startValue+perRankNum[n]
startValue=startValue/2;
end for
按照以上伪代码,就能求出每一层的自增开始值,从而求出具体编码值。
例2:使用上述方法,重新求解例1中的文本符号的霍夫曼编码如下:
令顶节点是第0层,那么统计叶节点个数,分别是第二层时,3个叶节点,第三层1个叶节点,第五层时4个叶节点。故perRankNum={0,0,3,1,0,4}。得到的perRankVal={0,2,1,1,2,0}。由于符号0,2,4的所在层是第二层,故其自增值是1,即0对应01,2对应10,4对应11。8所在层是第3层,故8对应01。16、32、33、34对应第五层,其编码分别是00、01、10、11。
使用十进制替代二进制表示,其编码符号如下表3所示:
表3
符号 |
0 |
2 |
4 |
8 |
16 |
32 |
33 |
34 |
编码值 |
1 |
2 |
3 |
1 |
0 |
1 |
2 |
3 |
长度 |
2 |
2 |
2 |
3 |
5 |
5 |
5 |
5 |
由于霍夫曼编码的长度是可变的,它与树的高度有关,编码时不希望组建的树太长以免内存溢出,那么就要限制树的长度。上文例1中描述的霍夫曼树,如果限制其最大编码长度为4,那么需要重新按如下方式组织霍夫曼树,即利用长度限制的霍夫曼编码,称之为LLHF(Length-Limited Huffman),改变霍夫曼树的结构如图9所示,具体步骤如下:
1)定义一个成本值,树在向降低成本值的方向上不停改变结构。
其计算方式的伪代码如下:
2)在符号编码长度小于Ndst的层中,从下向上寻找到每一层出现次数最小的符号,记录到数组rankLast[]中,如果这个层没有符号,记录0xF0F0F0F0到此数组中,表示此层没有符号。
上例的rankLast={节点8,节点4,0xF0F0F0F0,0xF0F0F0F0}
3)对成本值进行补偿,伪代码如下:
进一步,上述步骤S4;利用霍夫曼编码表对原始图像的残差进行压缩,得到编码数据以供解码处理,具体包括如下细分步骤S41至S43:
S41、利用所述霍夫曼编码表对所述原始图像的残差进行压缩,得到所述编码数据;
S42、对所述霍夫曼编码表进行压缩,得到压缩后的编码表;
S43、利用压缩后的编码表和编码数据进行解码。
需要说明的是,本实施例通过对霍夫曼编码表进行压缩,以进一步提升压缩率,霍夫曼编码表的具体压缩过程为:结合ZSTD算法和游程编码,对所述霍夫曼编码表进行压缩,得到压缩后的编码表。
需要说明的是,当每一次压缩的数据量比较小的时候,比如行像素是2048像素并按行压缩时,霍夫曼编码表的大小会对压缩率有很大的影响了。通常情况下,2048像素的原始图像数据经过相关操作后,会有70个左右的不同的符号,一个符号的编码长度最大是霍夫曼树的高度,高度设置一般大于8,故这个编码表大小需要280个字节。如果数据压缩率是2.0,那么加上表需要有1024+280=1304个字节,压缩率将会恶化为1.58。
如传递下面表4的编码表:
表4
原始值 |
0 |
16 |
32 |
68 |
127 |
158 |
编码长度 |
3 |
3 |
5 |
6 |
8 |
9 |
编码 |
001 |
010 |
00010 |
010001 |
00000011 |
000000001 |
即便有的编码长度比较小,但是总有长度大于8的字符,故传递编码表中的一列数据,至少需要(1+1+2)共四个字节。
ZSTD算法使用有限状态熵FSE(Finite State Entropy)编码霍夫曼表,将表压缩至40~60个字节。为了编码的方便性,本实施例将使用游程编码(Run Length Coding)替换FSE对霍夫曼表进行编码。这是由于使用SFALIC对原始图像数据进行残差计算后,残差按照指数下降分布,从而残差符号大量集中在0附近,使得使用游程编码成为可能。游程编码的思想是将重复多次出现的符号使用重复次数加符号来描述。如待编码文本是AAAAABBBBBCCCCD,那么游程编码将是5A5B4C1D,表示5个A连续,5个B连续,4个C连续,1个D连续。
需要说明的是,霍夫曼表本身并不利于压缩,ZSTD算法通过改变霍夫曼编码表的表述,使编码表较为容易压缩。ZSTD的这种方法伪代码如下:
ZSTD使用上面的weights来描述编码表,并在解码端重构出原始霍夫曼表。它使用了FSE算法对weights进行压缩。本实施例通过观察数据特点,对weights采用游长编码。
下表5是一个典型的霍夫曼编码表的weights数据,它来自于2048*2048的某一行图像数据,其中数值为0的数据被舍弃,表示此符号未出现。表5为一个典型的2048行像素的weights列表,其中数值等于0的符号被忽略。数值表示符号出现的概率,同样的数值表示符号在霍夫曼编码表中属于同一个层级。
表5
从这个列表数据可以看到它包含大量重复数据,且数据集中分布于0附近,其符合指数下降分布。其中数值描述符号在霍夫曼树中的层次,大致符合概率分布(数值9表示概率最高,1表示概率最低)。
这些符号的数值不会大于受长度限制的霍夫曼树的高度,如果令受限制长度不大于15,那么数值就可以用4个bits来表达,这样这个72个字节的数值可以用36个字节来表达。可以对符号进行游程编码,通常符号大多是连续的,在较大的地方不再连续,如表中红色部分。如果令后一个不连续符号减去前一个符号再减1,得到符号表是
{0......0,1,0,0,0,0,0,0,1,0,0,2,1,0,1,0,3,0,5,0,1,6,0,2,3,0,1,0,1,1,0,17}
其中前面省略了41个0.如果将表中前4分之3的数据使用游程编码,剩下的数据不编码,得到的新的编码是:
{(41,0),(1,1),(6,0),(1,1),(2,0),(1,2),(1,1),(1,0),1,0,3,0,5,0,1,6,0,2,3,0,1,0,1,1,0,17}
共34个字节,加上编码的数值32个字节,共66个字节。相比较FSE压缩到了48个字节,只多了18个字节,对压缩率只有轻微的影响。这里需要将weights的长度和第一个非0的weights的标号,也就是表5的符号起始值告诉解码端。
需要说明的是,以下将通过实验验证方式证明本发明融合算法的有效性。以下使用3份不同场景的数据对传统的SFALIC和本实施例融合方法进行验证,3份数据分别采集自由互联网下载得到的50份不同类别的数据(2048*2048)、50份采集自PCB板(2048*2048)和真实数据(16384*5000),下图10是这一类数据的缩略图,其中图10-(a)是50份互联网数据,图10-(b)是采集自PCB板数据,图10-(c)是真实场景的16K数据。
使用SFALIC和融合的方法SFALIC+LLHF(长度限制的霍夫曼编码),得到的实验比对分别如下表6:50份互联网数据,表7:50份PCB板数据,表8:16K场景数据。
表6
方法 |
最高压缩率 |
最低压缩率 |
平均压缩率 |
解码速度 |
SFALIC |
3.44 |
1.32 |
1.84 |
138.2MB/s |
SFALIC+LLHF |
3.50 |
1.29 |
1.76 |
282MB/s |
表7
方法 |
最高压缩率 |
最低压缩率 |
平均压缩率 |
解码速度 |
SFALIC |
2.92 |
1.23 |
1.91 |
138MB/s |
SFALIC+LLHF |
2.90 |
1.23 |
1.90 |
306.8MB/s |
表8
方法 |
最高压缩率 |
最低压缩率 |
平均压缩率 |
解码速度 |
SFALIC |
1.93 |
1.90 |
1.91 |
140.2MB/s |
SFALIC+LLHF |
1.91 |
1.87 |
1.88 |
453.0MB/s |
有上述实验所得到的结果看,本发明方法在保障压缩率的同时,至少比单一的SFALIC方法提升了一倍的解码速度。
作为进一步优选的方案,由于原始图像数据在经过SFALIC的残差计算后,基本均按照指数下降分布,数据均呈现出这样的特点,就为线下预训练好一个压缩的霍夫曼模型提供了可能。本实施例将根据这个思路,实验验证线下预训练压缩的霍夫曼模型,提前构建好霍夫曼编码表的可行性,并给出具体的量化的指标比对。
具体来说,预先在线下训练得到所述霍夫曼编码表的具体过程,包括如下步骤:
按行读取训练数据,并以一行数据作为一个训练样本;
对所述训练样本计算其残差;
判断所述训练样本的残差是否只有一个符号;
若是,则将所述训练样本去除;
若否,则将所述训练样本保留,并计算保留下来的训练样本的残差符号出现的次数,存入数组counts[256];
将数组counts[256]的所有值加1并归一化数组counts[256];
根据数组counts[256],预先计算出所述霍夫曼编码表。
本实施例在上述实施例公开的内容的基础上,在线下预训练好一个压缩的霍夫曼模型,对样本数据进行处理,得到一个霍夫曼编码表,在计算出原始图像的残差后,直接利用霍夫曼编码表对原始图像的残差进行压缩,得到编码数据以供解码处理。与上述实施例相比,无需在线实时构建霍夫曼表,因此可进一步加快解码速度。
以下通过试验方式对预训练的霍夫曼模型方法和上述融合方法的效果进行对比说明:
用的霍夫曼模型是在50份互联网图像,50份PCB板图像上训练得到。这些数据集图10-(a)、图10-(b)所描述。训练样本共100*2048=204800份。与未预训练的融合算法将使用第一部分《算法简介》中的3个测试集上,分别以最高压缩率、最低压缩率、平均压缩率、解码速度进行比对,参加下述表9-表12。
表9:在50份互联网数据上的实验比对
表10:在50份PCB板上的实验比对
方法 |
最高压缩率 |
最低压缩率 |
平均压缩率 |
解码速度 |
预训练融合 |
2.11 |
1.16 |
1.557 |
381.6MB/s |
未预训练融合 |
3.50 |
1.29 |
1.764 |
244.0MB/s |
表11:使用16384*5000的相机真实采集的图像
方法 |
最高压缩率 |
最低压缩率 |
平均压缩率 |
解码速度 |
预训练融合 |
1.750 |
1.733 |
1.739 |
438.4MB/s |
未预训练融合 |
1.909 |
1.874 |
1.886 |
390.6MB/s |
以上的数据和本文第二部分的《实验验证》数据稍有不同,是由于每次测试的本机使用环境稍有不同。但是在同一次实验中,基于预训练的方案速度明显较高,从而提供了一种压缩率和解压速度之间的折衷方案。
为了进一步验证预训练方案的特性,再次实验比对从互联网随机下载的10份样本图像,样本均归一化为2048*2048,并比较SFALIC和未预训练的融合算法的速度和压缩率如下:
表12:再次下载的2K*2K的图像
方法 |
最高压缩率 |
最低压缩率 |
平均压缩率 |
解码速度 |
SFALIC |
3.56 |
1.52 |
2.11 |
134MB/s |
未预训练融合 |
2.95 |
1.44 |
1.90 |
242MB/s |
预训练融合 |
2.15 |
1.43 |
1.72 |
388MB/s |
特别地,对于N=10Bits的数据,不适合使用霍夫曼编码,这是由于叶节点相对较多。但是如果10Bits数据的前8个Bits,在对这8Bits数据进行相关操作时,是完美符合指数下降分布的。因为10Bits图像的相邻像素间像素值的前8个Bits相关性较高,符合融合算法的条件。故对10Bits图像的前8个Bits进行融合算法的编码,对后两个Bits不进行编码,是一个可行的方案。
下面是关于使用此方案,实现的压缩率和解压速度的实验。实验比对分别如下:表13:50份互联网数据,表14:50份PCB板数据,表15:16K场景数据。
表13:50份互联网数据的实验
10Bits压缩 |
最高压缩率 |
最低压缩率 |
平均压缩率 |
解码速度 |
预训练融合 |
1.78 |
1.24 |
1.44 |
327MB/s |
未预训练融合 |
2.30 |
1.18 |
1.63 |
225MB/s |
表14:在50份PCB板上的实验
10Bits压缩 |
最高压缩率 |
最低压缩率 |
平均压缩率 |
解码速度 |
预训练融合 |
1.72 |
1.12 |
1.38 |
346MB/s |
未预训练融合 |
2.08 |
1.15 |
1.54 |
240MB/s |
表15:使用16384*5000的相机真实采集的图像
10Bits压缩 |
最高压缩率 |
最低压缩率 |
平均压缩率 |
解码速度 |
预训练融合 |
1.52 |
1.51 |
1.514 |
345MB/s |
未预训练融合 |
1.61 |
1.59 |
1.60 |
319MB/s |
对于10Bits的压缩,由于最后两个Bits不会进行编码,故压缩率会有所下降。
需要说明的是,通过在PC端模拟实际使用场景,来大致评估本发明融合方法和DALSA相机的压缩算法的性能比较:
DALSA向PC端每秒传输160MB数据进行解码,占用的CPU资源在i3-4170的CPU上约等于10%的CPU占有率。本方案在PC端使用TCP模拟这种收发包的环境,并在传输160MB数据,进行解码计算CPU占有率。
测试结果如下表16所示:
表16
从表中数据可以看出,本算法相比较于单一的SFALIC算法占用了20%以上的计算资源看,有十分明显的改进。与DASLA相机相比,本算法以近似等于DALSA的计算速度实现了图像无损压缩率的大幅的改善。
需要说明的是,本方案首先使用SFALIC计算残差,后使用长度限制的霍夫曼编码压缩残差的方案,在保障压缩率基本不变情况下,在原始的SFALIC解码速度上提升了一倍,达到240~280MB/s之间,即使按行压缩图像也能获得一个较高的压缩率。为了进一步提升解码速度,可以在线下进行预训练霍夫曼编码表的方法,来替代融合算法中的线上训练霍夫曼表的办法。使用预训练的融合算法的方法能在融合算法的基础上再次提升50%的解码速度,解码速度接近SFALIC的3倍,是FELICS的6倍速度。
需要说明的是,本实施例中选择压缩率和解码速度作为衡量标准。其中压缩率计算如下:
关于解码速度,公司之前定义的解码速度计算方式如下:
这是由于传统的解码速度定义为:
这样定义会有问题:由于大多数图像无损压缩算法的时间复杂度是Θ(n),n是待解码的像素个数。那么算法在某一幅图像压缩率较高,压缩后的数据就比较小,计算得到的解码速度就较低,同样如果某一幅图像压缩率较低,计算得到的解码速度就比较高,这样同样的算法,会根据需要压缩的图像的不同,其解码速度会忽高忽低。这个显然不能作为解码速度的指标。本实施例所定义的解码速度计算方法计算的解码速度将符合其时间复杂度的设定,且同一种算法解压缩速度将和压缩率无关。
如图11所示,本实施例还公开了一种图像无损压缩系统,包括:获取模块10、算术编码模块20、文本编码模块30和解码模块40;
获取模块10用于获取原始图像;
算术编码模块20用于采用算术编码方法计算原始图像的残差,并统计出残差中每个符号出现的次数,并存入数组counts[];
文本编码模块30用于根据数组counts[],循环组建出霍夫曼树,并使用限制长度的方法,对霍夫曼树各个叶节点进行编码,得到霍夫曼编码表;
解码模块40用于利用霍夫曼编码表对原始图像的残差进行压缩,得到编码数据以供解码处理。
本实施例所公开的图像无损压缩系统与上述实施例公开的图像无损压缩方法具有相同或相应的技术特征,也具有相同或相应的技术效果,该处不再赘述。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。