jpeg图像的压缩算法(一)

avatar
豌豆公主会员/攥着玻璃珠的小P孩 @豌豆公主

什么是JPEG

JPEG是Joint Photographic Experts Group的缩写,是一个图片处理方面的专家组,他们制定了一个图片压缩标准(ISO)。

所以,JPEG不是一个真正的图片格式,而是一个图片压缩标准。它包含一组参数和色彩空间的规则。不过它的应用范围没有那广,更常用的标准是JFIF。大家谈到JPEG压缩时大家时间是指它。注意,图片文件后缀是.jpeg和.jpg的,其实底层算法也是JFIF。

JPEG算法的底层假设

JPEG算法是针对人眼设计的,它利用了人眼的以下几个生物学特性:

  1. 我对颜色的亮度更敏感,对色彩相对没那么敏感;
  2. 我们对图片的高频区域没那么敏感;

这个算法可以分成几步:对于输入(一张图片),会经过以下处理:

  1. 色彩变换;
  2. 对每个8 * 8的块做离散余弦变换;
  3. 量化阶段;
  4. 哈夫曼编码;

最后,一个压缩过的图片就诞生了,它存在于一个.jpg文件中。这个文件里,不但有解压缩的信息,还有其它重新展开图片的信息。

一张未压缩的图片

MATLAB有各种各样的图片,下面是一堆辣椒的照片。 pepper

I = imread('peppers.png');
imshow(I);

它当前需要大概4718592字节空间去存储:

ImageSize = 8*prod(size(i))

ImageSize = 4718592;

色彩变换:把RGB转成YCbCr

显卡通过设置RED、BLUE、GREEN(也就是rgb)三个色值来显示一个颜色。这三个颜色组成了笛卡尔坐标系的三个轴,每一种颜色都是这个色彩“三维”空间中一个点。当某一个点的RED、GREEN、BLUE三个维度值相同时,就显示成一个灰色的图片。在JPEG的压缩算法中,我们使用另一种颜色空间-YCrCb,它也有三个维度:亮度,用Y表示;蓝色用U表示;红色用V表示。这个三维度的值可能通过下面的公式从rgb系统中转换过来:

	Y =  0.299  R + 0.587  G + 0.114  B
	U = -0.1687 R - 0.3313 G + 0.5    B + 128
	V =  0.5    R - 0.4187 G - 0.0813 B + 128

降低采样

现在我们拿到了每个像素的YCrCb表示,接下来做第一步压缩:降低采样。首先把图片切成一个个8*8的小块,采样时,把每个像素的亮度值都保留下来,而UV值每四个保留一个,大致如下: sample 比如一行有8个像素,每个像素的3个维度分别用3个字节表示,那原来需要

8*3=24 个字节来存储

降低采样后,只需要

8+2+2=12 个字节来存储

需要的空间直接减少一半。

下一步:离散余弦变换 DCT