z i g z a g 压 缩 算 法 ( 2 0 2 0 )
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JPEG图像压缩
1算法思【现场实操追-女生资-源】想:
JPEG算法主要负责定制静态图像的编码方法,其核心是DCT变换,经过DC【扣】T变换将时域图像转换为频率域的图像,变换后的矩阵中左上角的系数【1】比较大,而右下角的系数比较小,基本接近于0。根据这个特性,【О】经过量化以及编码过程,我们可以去除图像中的空间冗余,以达到【⒈】压缩的效果。并且根据人眼对亮度以及色度的敏感度的不同,对亮度以【6】及色度进行不同程度的压缩,从而在保证图像品质的条件下得到【⒐】更高的压缩率。
2算法【⒌】流程
3主要【2】步骤
(1)【б】? 颜色转换
JPEG采用的是YCrCb颜色空间,而BMP采用的是RGB颜色空间,要想对BMP图片进行压缩,首先需要进行颜色空间的转换。YCrCb颜色空间中,Y代表亮度,U代表饱和度,V代表色度。U,V也可以通称为色度。
Y?=?0.299R+0.587G+0.114B
U=?-0.1687R-0.3313G+0.5B+128
V=?0.5R=0.418G-0.0813B+128
一般来说,U和V应该是一个有符号的数字,?但这里通过加上128,使其变为8位的无符号整数,从而方便数据的存储和计算。
(2)? 采样
JPEG图片中,通常采用两种采样方式:YUV411和YUV422,它们所代表的意义是Y,U,V三个分量的数据取样比例一般是4:1:1或者4:2:2。这样的采样方式,虽然损失了一定的精度但也在人眼不太察觉到的范围内减小了数据的存储量。
?YUV4:1:1
4:1:1的色度抽样,是在水平方向上对色度进行4:1抽样。对于低端用户和消费类产品这仍然是可以接受的。对非压缩的8比特量化的视频来说,每个由4个水平方向相邻的像素组成的宏像素需要占用6字节内存(亮度4个字节,两个色度各1个字节)。
下面的四个像素为:?[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3V3] 存放的码流为:?Y0 U0 Y1 Y2 V2 Y3
映射出像素点为:[Y0 U0 V2][Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2] YUV 4:2:2
每个色差信道的抽样率是亮度信道的一半,所以水平方向的色度抽样率只是4:4:4的一半。对非压缩的8比特量化的图像来说,每个由两个水平方向相邻的像素组成的宏像素需要占用4字节内存(亮度2个字节,两个色度各1个字节)。。
下面的四个像素为:?[Y0 U0V0] [Y1 U1 V1]?[Y2 U2 V2] [Y3 U3 V3] 存放的码流为:?Y0 U0 Y1V1?Y2 U2 Y3 V3
映射出像素点为:[Y0 U0 V1] [Y1 U0V1] [Y2 U2 V3] [Y3 U2 V3] (3)?分块
源图象中每点的3个分量是交替出现的,先要把这3个分量分开,存放到3张表中去。然后由左及右,由上到下依次读取8x8的子块,存放在长度为64的表中,即可以进行DCT变换。如果原始图片的长宽不是8的倍数,?都需要先补成8的倍数,?使其可以进行一块块的处理。编码时,程序从源数据中读取一个8x8的数据块后,进行DCT变换,量化,编码,然后再读取、处理下一个8*8的数据块。?图像的数据值必须减去128,是因为DCT公式所接受的数字范围是-128到127之间。
(4)? DCT变换
DCT(离散余弦变换)是将图像从空间域转换到频率域中,是一种无损的变换方式,可以去除图像中的空间冗余。在JPEG中,分别对8x8的分块进行变换,其变换方程为:
当u=0,v=0时:
当u,v不为0时:
其中,N=64,而u,v=1,2.N-1。
其变换后的8x8数组中的每个数字为原8x8数组中的每个数字经过一定的组合而成,最终变换后的数组的左上角表示原图片的低频部分,右下角表示图片的高频部分,经过反变换可以变换回原图片。
(5)? Zigzag扫描
?DCT?将一个?8x8?的数组变换成另一个?8x8?的数组.?但是内存里所有数据都是线形存放的,?如果我们一行行的存放这?64?个数字,?每行的结尾的点和下行开始的点就没有什么关系。JPEG算法按如下方式扫描存储数据,数列里的相邻点在图片上也是相邻的了。
(6)量化
量化阶段需要两个8*8量化矩阵数据,一个是专门处理亮度的频率系数,另一个则是针对色度的频率系数,将频率系数除以量化矩阵的值之后取整,即完成了量化过程。当频率系数经过量化之后,将频率系数由浮点数转变为整数,这才便于执行最后的编码。不难发现,经过量化阶段之后,所有的数据只保留了整数近似值,也就再度损失了一些数据内容。在JPEG 算法中,由于对亮度和色度的精度要求不同,分别对亮度和色度采用不同的量化表。前者细量化,后者粗量化。
(6)?编码
DC系数编码
DC系数即直流分量系数,是对8x8模块进行DCT变换后的第一个分量,其具有以下两个特点:
a.系数的数值比较大;
b.相邻的8*8图像块的DC系数值变化不大;
根据这两个特点,DC系数一般采用差分脉冲调制编码DPCM,即:取同一个图像分量中每个DC值与前一个DC值的差值来进行编码。
AC系数编码
量化之后的AC系数的特点是,63个系数中含有很多值为0的系数,因此,可以采用行程编码RLC来更进一步降低数据的传输量。在JPEG编码中,假设RLC编码之后得到了一个(M,N)的数据对,其中M是两个非零AC系数之间连续的0的个数(即,行程长度),N是下一个非零的AC系数的值。采用这样的方式进行表示,是因为AC系数当中有大量的0,而采用
Zigzag扫描也会使得AC系数中有很多连续的0的存在,如此一来,使用RLC编码会大大降低数据的传输量。
对于AC系数,有两个符号。符号1为行程和尺寸。(0,0)和(15,0)是两个比较特殊的情况。(0,0)表示块结束标志(EOB),(15,0)表示ZRL,当行程长度超过15时,用增加ZRL的个数来解决,所以最多有三个ZRL(3×16+15=63)。符号2为幅度值(Amplitude)。
在得到DC系数的中间格式和AC系数的中间格式(借助VLI编码表)之后,为进一步压缩图象数据,有必要对两者的第一个字节进行熵编码。JPEG基本系统规定采用Huffman编码。
Huffman编码时DC系数与AC系数分别采用不同的Huffman编码表,对于亮度和色度也采用不同的Huffman编码表。因此,需要4张Huffman编码表才能完成熵编码的工作。具体的Huffman编码采用查表的方式来高效地完成。然而,在JPEG标准中没有定义缺省的Huffman表,用户可以根据实际应用自由选择,也可以使用JPEG标准推荐的Huffman表。或者预先定义一个通用的Huffman表,也可以针对一副特定的图像,在压缩编码前通过搜集其统计特征来计算Huffman表的值。
这个算法的java代码放在thrift的org.apache.thrift.protocol.TCompactProtocol类里,数据传输的时候用做数字的压缩,以减少数据的传输量。
在聊这个算法之前,我们得先补补课,聊聊二进制补码相关的东东。
把8 * 8的DCT系数矩阵排列成1*64的向量,沿Z字形路径可以有效积累连续0的个数,提高编码压缩效率。DC系数和低频的AC系数被排在