为什么要压缩图片?
表示图像需要大量的数据,但图像数据是高度相关的,或者说存在冗余(Redundancy)信息,去掉这些冗余信息后可以有效压缩图像,同时又不会损害图像的有效信息。
视网膜上有两种感光细胞,能够感知亮度变化的视杆细胞,以及能够感知颜色的视锥细胞,由于视杆细胞在数量上远大于视锥细胞,所以我们更容易感知到明暗细节。
数字图像的冗余表现为以下几种形式:空间冗余、时间冗余、视觉冗余、信息熵冗余、结构冗余和知识冗余。
(1)空间冗余:图像内部相邻像素之间存在较强的相关性所造成的冗余。
(2)时间冗余:视频图像序列中的不同帧之间的相关性所造成的冗余。
(3)视觉冗余:是指人眼不能感知或不敏感的那部分图像信息。
(4)信息熵冗余:也称编码冗余,如果图像中平均每个像素使用的比特数大于该图像的信息熵,则图像中存在冗余,这种冗余称为信息熵冗余。
(5)结构冗余:是指图像中存在很强的纹理结构或自相似性。
(6)知识冗余:是指有些图像还包含与某些先验知识有关的信息。
压缩分类
无损压缩:第一类压缩过程是可逆的,也就是说,从压缩后的图象能够完全恢复出原来的图象,信息没有任何丢失
有损压缩:第二类压缩过程是不可逆的,无法完全恢复出原图象,信息有一定的丢失
压缩图片的应用
图象压缩一般通过改变图象的表示方式来达到,因此压缩和编码是分不开的。图象压缩的主要应用是图象信息的传输和存储,可广泛地应用于广播电视、电视会议、计算机通讯、传真、多媒体系统、医学图象、卫星图象等领域。
编码的种类
压缩编码的方法有很多,主要分成以下四大类:(1)象素编码;
(2)预测编码;
(3)变换编码;
(4)其它方法。
1:所谓象素编码是指,编码时对每个象素单独处理,不考虑象素之间的相关性。
2:所谓预测编码是指,去除相邻象素之间的相关性和冗余性,只对新的信息进行编码。举个简单的例子,因为象素的灰度是连续的,所以在一片区域中,相邻象素之间灰度值的差别可能很小。如果我们只记录第一个象素的灰度,其它象素的灰度都用它与前一个象素灰度之差来表示,就能起到压缩的目的。如248,2,1,0,1,3,实际上这6个象素的灰度是248,250,251,251,252,255。表示250需要8个比特,而表示2只需要两个比特,这样就实现了压缩。
3:所谓变换编码是指,将给定的图象变换到另一个数据域(如频域)上,使得大量的信息能用较少的数据来表示,从而达到压缩的目的。
JPEG压缩算法
JPEG算法的第一步:图像被分割成大小为8X8的小块,
第二步:颜色转换RGB为YCbCr
所谓“颜色空间”,是指表达颜色的数学模型,比如我们常见的“RGB”模型,就是把颜色分解成红绿蓝三种分量,这样一张图片就可以分解成三张灰度图,数学表达上,每一个8X8的图案,可以表达成三个8X8的矩阵,其中的数值的范围一般在[0,255]之间。
不同的颜色模型各有不同的应用场景,例如RGB模型适合于像显示器这样的自发光图案,而在JPEG压缩算法中,需要把图案转换成为YCbCr模型,这里的Y表示亮度(Luminance),Cb和Cr分别表示绿色和红色的“色差值”。
人们发现红绿蓝三种颜色所贡献的亮度是不同的,绿色的“亮度”最大,蓝色最暗,设红色所贡献的亮度的份额为KR,蓝色贡献的份额为KB,
最终可以得到RGB转换为YCbCr的数学公式为
PEG把图像转换为YCbCr之后,就可以针对数据得重要程度的不同做不同的处理。
第三步:DCT(离散余弦变换)
利用数学函数,将矩阵
第四步:量化
离散余弦变换,图像数据虽然已经面目全非,但仍然是处于“可逆”的状态。
JPEG压缩的最后一步:对数据进行哈弗曼编码
JPEG压缩过程总结
整个JPEG压缩图片的过程:
- 将整张图片分为若干8*8的矩阵
- 对每个8*8矩阵进行DCT变换
- 对DCT后的矩阵进行量子化
- 重新进行ZIGZAG排序
- 将DC分量和AC分量分别进行DPCM和RLE编码
- 将整体信息进行Huffman编码