具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明作进一步的详细描述。
无失真熵编码选择Huffman编码,霍夫曼编码的基本思想是可变长最佳编码定理,即根据源数据符号出现的概率大小进行编码,出现概率大的符号分配越短的码字,出现概率越小的符号分配越长的码字,从而达到用尽量少的比特数表示数据源的目的。
不同类型的图像其细节的复杂程度会有很大的不同,比如天空或者墙壁的图像内容就较为一致,而一幅树叶的图像就有极高的变化细节。单纯依靠一个Huffman码表很难满足所有的图像类型,为此本发明实施例采用多个huffman码表,以分别适用于具有较少/中等/极高等细节的图像。
图1所示为本发明实施例提供的一种具有分组自适应熵编码的图像压缩方法。如图1所示,该方法包括:
步骤100:确定huffman码表的个数。
在本发明一实施例中,huffman码表的个数可以为3,分别适用于具有较少/中等/极高等细节的图像。具体来说,较少细节的图像采用Huffman码表1,中等程度细节变化的图像采用Huffman码表2,极高细节的图像采用Huffman码表3。
步骤101:将每个压缩单元按照像素值划分为多个组。
在某一实施例中,可以将每16个像素为一组,也可以设定为其他值。
本领域技术人员可以理解,如果某个压缩单元的像素值小于像素组的预定值时,不需要执行步骤101。
本领域技术人员可以理解,步骤100和步骤101的顺序也可以随意调整。
步骤102:在对某一组像素进行编码时,计算每一种huffman码表编码该组像素后压缩数据的长度,确定压缩数据长度最短的Huffman码表,利用该压缩数据长度最短的huffman码表编码该组像素。
图2所示为huffman编码选择的示例,以Huffman码表1/2/3为例,可以分别计算Huffman码表1/2/3对当前像素组编码后的压缩数据的长度,假设根据该像素组的codenum值确定huffman码表1对该像素组进行编码的长度最短,则利用huffman码表1编码该像素组。
每个像素组的编码后数据除了包括熵编码本身外,还包括码表标识,以标识当前像素组所使用的码表。
在一示例中,可以用huff_table_sel标示是否采用了huffman编码以及压缩数据长度最短的Huffman码表。这里,本领域技术人员可以理解,若某个像素组的预测误差都是0,则无需Huffman编码。
其中,下表为huff_table_sel的值的一个示例:
huff_table_sel |
Huffman码表 |
0 |
无(预测误差全是0) |
1 |
Huffman码表1 |
2 |
Huffman码表2 |
3 |
Huffman码表3 |
表1Huffman码表的选择
在表1所示的情况下,可以用一个2bit的huff_table_sel即可满足系统要求。本领域技术人员可以理解,可以根据需要调整huff_table_sel的大小。
步骤103:将压缩单元的每个像素组编码后的压缩数据首尾连接构成该压缩单元的Huffman编码。
图3所示为一压缩单元的huffman编码示例,如图3所示,该压缩单元的Huffman编码由每个像素组首位连接构成,每个像素组的压缩数据分别由huff_table_sel和紧随其后的这一组像素的组成。
步骤104:如果一个压缩单元的压缩数据不是byte对齐,则在该压缩单元的压缩数据末尾填充1~7bit的0以保证压缩数据最终byte对齐。
为确保填充bit对平均压缩率不会带来太大的降低,压缩单元中像素个数要尽可能地多。
在本发明另一实施例中,还可以进一步根据压缩单元像素精度(BitDepth=8~16)以及量化参数QP的不同,自适应地调整每个Huffman码表的特性。
在本发明一实施例中,可以利用不同阶数的指数哥伦布码作为不同的Huffman码表。具体而言,根据要处理的像素值的像素精度(BitDepth)以及量化参数QP自适应地选择每一个Huffman码表的阶数k。
在本发明一实施例中,根据申请人长期反复的测试实验发现,当某一像素组的BitDepth=8、QP=0时,Huffman码表阶数K=1时效果最好。同时,BitDepth每提高2,K要增加1;QP每增加2,K要降低1。
故,在本发明一实施例中,可以利用如下的公式获得不同指数哥伦布码的阶数:
k=Max((BitDepth-QP-6)/2,0)
表2给出了0阶、1阶和2阶指数哥伦布码的结构示例。指数哥伦布码的比特串分为“前缀”和“后缀”两部分。前缀由leadingZeroBits个连续的‘0’和一个‘1’构成。后缀由leadingZeroBits+k个比特构成,即表中的xi串,i的范围为从0~(leadingZeroBits+k-1),每个xi的值为0或1。
表2k阶指数哥伦布码表
编码k阶指数哥伦布码时,为了增加效率,可以直接将码字(huff_code)对应的十进制数获得码字序列,其中,码字对应的十进制计算公式为:
huff_code=2k+CodeNum;
可以直接利用如下伪代码计算出k阶指数哥伦布码的码字长度(huff_length),如下:
在解析利用本发明实施例编码的压缩码流时,首先获得每一个像素组的Huffman码表标识,然后在从比特流的当前位置开始寻找第一个非零比特,并将找到的零比特个数记为leadingZeroBits,然后根据leadingZeroBits计算CodeNum。用伪代码描述如下:
LeadingZeroBits=-1
for(b=0;!b;leadingZeroBits++)
b=read_bits(1)
CodeNum=2leadingZeroBits+k-2k+read_bits(leadingZeroBits+k)
在本发明一实施例中,在进行压缩之前,首先可以根据原始图像格式,将原始图像划分为多个压缩单元(CompressUnit,CU)。
当原始图像格式为YUV格式时,如图4所示,可以将Y分量阵列分成若干方块(允许将一帧图像的Y分量阵列划分成不同尺寸的方块),每个方块即为一个独立的压缩单元。同样,色度分量阵列按照UV交织排列后分成若干方块(允许将一帧图像的色度分量阵列划分成不同尺寸的方块),每个方块即为一个独立的压缩单元。
对于RAW格式的原始图像,在划分多个压缩单元时,如图5所示,可以不区分R/G/B分量,直接将原始图像分成若干方块(允许将原始图像划分成不同尺寸的方块),每个方块即为一个独立的压缩单元。
将原始图像划分成压缩单元后,即可以压缩单元为基本单位进行压缩/解压缩。每个压缩单元的压缩/解压缩过程完全相互独立,无需参考位于其它压缩单元中的像素。
图6所示为本发明实施例提供的一种基于分组自适应熵编码的图像无损/近无损压缩模块的结构示意图。压缩过程中,压缩模块接收压缩单元的原始数据,对压缩单元内的像素以光栅扫描顺序依次编码。如图6所示,该压缩模块包括:预测器、量化、反量化、图像重建、熵编码。
预测器的主要目的就是在空间域尽可能对图像去相关,以提高压缩比,同时将图像数据变换映射成适于熵编码的数据源。
去相关的方法主要是按特定的预测式、根据相邻像素,生成当前像素X的预测值X’。在进行自适应预测后,用当前的像素值X减去其预测值X’得到预测误差ε:
ε=X-X’
预测器输出的是当前像素值X的预测值X’,以及预测误差ε。
下面将详细阐述如何利用当前像素值X获得预测值X’。
首先,以图7所示的当前像素X与相邻像素的空间位置关系为例说明“相邻像素”定义。
对于YUV格式的图像,“相邻像素”与X必须同为Y分量,U分量,或者V分量。
对于RAW格式的图像,“相邻像素”与X必须同为R分量,G分量,或者B分量。也就是说,当前像素X的预测仅参考相同的分量。如果输入给压缩单元的是RAW格式的数据,那么所谓的相邻像素A实际上是当前像素X的左边第二个像素,相邻像素B实际上是当前像素X的上方第二个像素,其它相邻像素依此类推。
其次,预测器的关键在于预测式的选择,只有设计针对大量图像数据普适性强的预测式,才能更好的进行去相关。本发明实施例提供的预测器采用经典的中值预测(MedianEdgeDetector,MED)和梯度预测(Gradient-adjustedPredictor,GAP)的组合。
中值预测是一个复杂度低而预测效果较好的非线性自适应预测器,其核心思想是根据当前像素X所处的位置来优选预测值。
当当前像素X的左侧出现竖直纹理时选择上方相邻像素B,当当前像素X的上方出现水平纹理时选择左侧相邻像素A,当没有发现明显的纹理时则选择较平均的(A+B-C)作为预测值。
即,基于当前像素X的相邻像素得到预测值X’的表达式如下:
也可以认为预测值X’是A,B和A+B-C的中值,这种情况下,基于当前像素X的相邻像素得到预测值X’的表达式为:
X’=Median(A,B,A+B-C)
单纯的中值预测只能对处于水平或竖直纹理的像素点取得较为精确的预测结果,但对图8所示的左斜或右斜的纹理无能为力。单纯的梯度预测虽然能比中值预测(MED)更精确地体现出水平或竖直纹理属性,但同样对图5所示的左斜或右斜的纹理无能为力。
本发明实施例提供的梯度预测可以兼顾了水平/竖直/左斜/右斜四个方向的纹理属性,可以在更大程度上挖掘相邻像素间的相关性从而提高预测精度,其具体过程如下:
1)首先估计周围相邻像素点的水平/竖直/左斜/右斜四个方向的梯度值;
dh=(|A-G|+|B-C|+|B-D|+|J-C|)>>(BitDepth-8)//水平梯度值
dv=(|A-C|+|B-E|+|D-F|+|C-K|)>>(BitDepth-8)//竖直梯度值
dld=(|A-J|+|C-M|+|B-K|+|D-E|)>>(BitDepth-8)//左斜梯度值
drd=(|A-B|+|B-F|+|G-C|+|C-E|)>>(BitDepth-8)//右斜梯度值
2)然后根据以上梯度值加权相邻像素,使其作为当前像素的预测值。
本发明实施例提供的预测式,根据每个像素点位于其所在压缩单元的位置,利用相邻像素可用性的差异,采用不同的预测方法,具体如下:
1)对于压缩单元的第一个像素,不进行预测和熵编码,直接存储原始像素X;
2)对于压缩单元的第一行像素点,预测值X’=A;
3)对于压缩单元的第一列像素点,预测值X’=B;
4)对于压缩单元的第二行,第二列以及最后一列像素点,使用中值预测,预测值X’=Median(A,B,A+B-C);
5)对于其他像素点,使用梯度预测,预测值X’=Pred_GAP(A,B,C,D,E,F,G,J,K,M)。
预测器输出的是当前像素值X的预测值X’,以及预测误差ε。
量化(Quantisation)模块将预测器输出的预测误差ε按以下方法进行量化处理:
ε’=Sign(ε)*(|ε|+QP)/(2*QP+1)
当量化参数QP=0时,ε’=ε,即为无损压缩模式。
通过以上量化,将处于区间[ε’*(2*QP+1)-QP,ε’*(2*QP+1)+QP]的预测误差统一量化为ε’,量化后的预测误差ε’大小相当于原先的2*QP+1分之一左右,对ε’进行无失真熵编码能获得更高的压缩效果。量化参数QP的值越大,量化后的预测误差ε’越小,熵编码获得的压缩比越高。
在无损压缩依旧无法满足带宽要求的情况下,可使用近无损压缩来进一步提高压缩效果。
在生成当前像素的量化预测误差ε’之后,反量化模块按以下方法作反量化处理:
ε^=(2*QP+1)*ε’
反量化所得重建预测误差ε^将供图像重建使用。
为了能保证解压缩所获重建图像的每个像素与原始像素之间的误差绝对值不超过量化参数QP,在压缩模块中的预测过程必须参考相邻的重建像素而不是原始像素。为此,在对当前像素的预测误差ε作量化/反量化处理后,需要进行图像重建,生成当前像素的重建值X^,将其作为当前压缩模块中后续未编码像素的参考像素。
X^=X’+ε^。
由于压缩和解压缩过程中使用完全一致的预测方法且都是参考相邻的重建像素,加上无失真熵编码获得的相同重建预测误差ε^,所以能保证压缩和解压缩过程中所获得的像素重建值X^完全一致,解压缩模块获得的像素重建值X^与像素原始值X之间的误差Diff
Diff=|X-X^|
=|(X’+ε)-(X’+ε^)|
=|ε-ε^|
≤QP
分组自适应熵编码
分组自适应熵编码模块利用本发明以上实施例提供的基于分组自适应熵编码的图像压缩方法,对量化预测误差ε’进行无失真熵编码,产生压缩单元的压缩数据。
在对量化预测误差ε’进行无失真熵编码之前,需要进行相应的预处理。由于熵编码针对的是非负的正整数CodeNum,因此需要对量化预测误差ε’
量化预测误差ε’的取值与CodeNum的映射关系见表3。
CodeNum |
量化预测误差ε’ |
0 |
0 |
1 |
-1 |
2 |
1 |
3 |
-2 |
4 |
2 |
5 |
-3 |
6 |
3 |
K |
(-1)k×Ceil(k÷2) |
表3量化预测误差ε’的取值与CodeNum的映射关系
图9所示为本发明实施例提供的一种图像无损/近无损解压缩模块的结构框图。解压缩模块接收压缩单元的压缩数据,对压缩单元内的像素以光栅扫描顺序依次重建。如图9所示,该解压缩模块包括:
熵解码模块从压缩单元的压缩数据中解码出当前像素的量化预测误差ε’,具体而言,对每个像素组,先从压缩数据中获取huff_table_sel,然后根据huff_table_sel的值选择相应的Huffman码表解码得到量化预测误差ε’。
经反量化后生成重建预测误差ε^。与此同时,预测器根据相邻的重建像素预测得到当前像素的预测值X’,预测值X’与重建预测误差ε^相加得到当前像素的重建值X^。
解压缩和压缩的过程是非常对称的,解压缩完全是压缩的逆过程。也就是说,解压缩模块和压缩模块是用同样的基本过程,步骤相同但处理次序相反。
本发明实施例提供的压缩、解压缩方法支持的图像色彩格式包括但不限于YUV420/422、RAW_GR、RAW_RG、RAW_GB、RAW_BG;支持的图像像素精度包括但不限于8/10/12/16bit。利用本发明实施例提供的压缩、解压缩方法,图像压缩率高、实时性好、近无损压缩保真度高、硬件实现复杂度低。
下面以具体的实验数据验证本发明实施例提供的基于分组自适应熵编码的压缩效果。
测试一YUV4208bit序列测试
测试采用了总共23个YUV4208bit序列。按块压缩时压缩单元大小:亮度分量16x8,色度分量8x4。
YUV4208bit序列亮度分量按块压缩时的压缩率随量化参数变化的曲线图如图10所示。
YUV4208bit序列色度分量按块压缩时的压缩率随量化参数变化的曲线图如图11所示。
YUV4208bit序列的平均压缩率随量化参数变化如表4所示:
表4YUV4208bit序列的平均压缩率
在近无损压缩后,重建图像会在某种程度与原始图像不同。为了客观地衡量经过近无损压缩后的重建图像品质,用最普遍,最广泛使用的峰值信噪比(PeakSignaltoNoiseRatio,PSNR)来衡量重建图像的失真度;PSNR的单位为dB,PSNR值越大,就代表失真越少。
PSNR=10*log10((2BitDepth-1)2/MSE)
其中,MSE指的是原始图像与重建图像之间的均方误差(MeanSquareError);
YUV4208bit序列在近无损压缩后的平均峰值信噪比随量化参数变化如表5所示:
表5YUV4208bit序列在近无损压缩后的平均峰值信噪比
测试二RAW10bit图像测试
测试采用了总共20个RAW10bit图像。按行压缩,压缩单元大小:Pic_Widthx1,Pic_Width为RAW图像的宽度。
RAW10bit图像的压缩率随量化参数变化的曲线图如图12所示。
RAW10bit图像的平均压缩率随量化参数变化如表6所示:
表6RAW10bit图像的平均压缩率
RAW10bit图像在近无损压缩后的平均峰值信噪比随量化参数变化如表7所示:
表7RAW10bit图像在近无损压缩后的平均峰值信噪比
测试三RAW16bit图像测试
测试采用了总共6个RAW16bit图像。按行压缩,压缩单元大小:Pic_Widthx1,Pic_Width为RAW图像的宽度。
RAW16bit图像的压缩率随量化参数变化的曲线图如图13所示。
RAW16bit图像的平均压缩率随量化参数变化如表8所示:
表8RAW16bit图像的平均压缩率
RAW16bit图像在近无损压缩后的平均峰值信噪比随量化参数变化如表9所示:
表9RAW16bit图像在近无损压缩后的平均峰值信噪比
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换等,均应包含在本发明的保护范围之内。