欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

音视频基础_5_图像压缩技术简介

程序员文章站 2022-07-02 10:30:40
...

图像压缩技术简介

人眼和相机的成像原理

初中时我们都学过凸透镜成像,人眼和相机本质上都是凸透镜成像原理。人眼的晶状体和相机的镜头焦距,都可以调节焦距,从而看到远近不同的物体。有一点需要注意,凸透镜成像形成的是倒立的像,人的大脑会将其纠正为正立的像,而相机则需要通过特殊的元器件进行翻转,例如五棱镜等。

早期的相机都是使用胶片作为成像设备,光线打在胶片上,发生化学反应,形成底片,之后再洗出照片。而现在的相机一般都是感光元件将光信号转为电信号,然后电信号转为数字信号,图像的原始数据可直接写入存储设备,方便计算机进行处理。

当然,实际上相机的原理远比这要复杂的多,那是另一个领域,这里不再做过多的介绍。

RAW 格式图片

计算机中的图片是从哪来的?计算机中的图片来源,本质上只有两个:照相机/摄像机拍摄到图片,或者计算机内部使用图形图像代码库生成的图片(如游戏画面)。这里我们不讨论后者,主要介绍照相机拍摄到的图片。

前面我们讲过,现在的相机可将光信号转为数字信号写入存储设备,这就是最原始的图像数据。这种图像数据一般被称为 RAW 格式图片。RAW 格式图片中包含原始图像的RGB信息,以及快门速度、光圈值、白平衡等相机元数据。可以说,图像领域的 RAW 格式的图片就相当于声音领域的 PCM 数据。PS. 不同相机导出的 RAW 格式图片,其文件的后缀名可能不同。

图片中的每个像素的信息是RGB三色光信息混合而成。RGB三色光有时被称为三个通道,三个通道各有自己的值。而比特深度则用来描述每个通道的所有级别的值的数量,256 是 2 的 8 次方,那么我们可以说,比特深度为 8。这点和声音采样量化中的比特深度类似。

我们知道 PCM 数据体积是很大的,RAW 格式图片也是如此。假设相机拍出来的照片分辨率为 3264 * 2448,约800万像素(稀松平常的分辨率),每个像素RGB通道的比特深度均为8bit(实际上可能是16bit),则一个像素的大小为 24bit 即 3Byte,这张图片的大小为:8000000*3 = 24000000Byte,约为 23MB。这个大小如果只是存在硬盘上,还能接受,但是如果进行网络传输,那么这个数据量就太大了,必须进行压缩。

JPEG 可以说是最常见,最流行的图片压缩技术,它由联合图像专家组(Joint Photographic Experts Group)开发。使用 JPEG 压缩的图片,其后缀名大都为 .jpg 或 .jpeg。JPEG 是一种有损压缩技术,压缩过程中会将原始图像数据中不重要的部分去掉,以便可以用更小的体积保存。2000 年时推出了新的 JPEG 2000 技术,支持无损压缩,但是常用的还是 JPEG 有损压缩算法。

下面就来讲讲 JPEG 压缩原理。

YUV 色彩模式

科学实验证明,人眼对亮度更敏感,对颜色的敏感程度不如对亮度的敏感程度,例如在昏暗的光线下,人只能看到物体的明暗,却分辨不出颜色。另外,人眼对色彩的位置信息也不如对亮度信息敏感。YUV 色彩模式就利用了这些原理。

YUV 模式最早是用在彩色电视领域,是为了解决当时彩色电视信号带宽的问题(这个我们后面还会再说)。后来称为彩色视频领域的通用标准,在彩色电视,计算机图像,数字视频领域都有着非常广泛的应用,并从中衍生出各种子模式,例如用在彩色电视模拟信号中的 YPbPr/YIQ,用在计算机图像和视频领域的 YCbCr 等等。

YUV 中的 Y 表示像素的亮度,也就是灰度值,而 U、V 表示像素的色度,二者共同决定色相和饱和度(有点像HSB色彩模式,不过准确来说U和V分别表示蓝色和红色的“色差值”)。对于 YUV 所表示的图像,Y 和 UV 分量是分离的。如果只有 Y 分量而没有 UV 分量,那么就是黑白图像。彩色电视机采用的就是 YUV 信号,解决与和黑白电视机的兼容问题,使黑白电视机也能接受彩色电视信号。

YUV 颜色空间是从RGB颜色空间推导而来。二者可相互转换,即可以从 RGB 计算出 YUV 的值,也可以将 YUV 还原为 RGB 值。

计算机图像和视频领域使用的 YCbCr 模式,这是 YUV 的一种缩放和偏移模式,它与 RGB的转换如下:

Y = 0.298R + 0.612G + 0.117B;
U = -0.168R - 0.330G + 0.498B + 128;
V = 0.449R - 0.435G - 0.083B + 128;

R = Y + 1.4075( V - 128);
G = Y - 0.3455( U - 128) - 0.7169( V - 128);
B = Y + 1.779( U - 128);

这些公式倒是不用背,用到时查即可。

JPEG 压缩原理

我们前面说过,人眼对亮度更敏感,对颜色的敏感度不如亮度。JPEG 压缩的第一步就是将RGB图像分解为 Y,Cb,Cr 三个分量。比如下面这张图:
音视频基础_5_图像压缩技术简介
分解之后就成了:
音视频基础_5_图像压缩技术简介音视频基础_5_图像压缩技术简介音视频基础_5_图像压缩技术简介
第二步,将 Y 分量的数据完全保留下来,对 Cb,Cr 两个分量进行降采样,意思就是,将多个像素的颜色变为一个像素的颜色,这样一来,数据量就减少了很多。至于到底降低到什么程度,后面讲视频原理是会继续分析。

第三步,将图像分为若干个 8*8 的小块,方便后续的算法处理。

第四步,离散余弦变换(DCT Discrete Cosine Transform),这是 JPEG 中的核心算法,大致原理是,将人眼敏感的部分(例如颜色的边界,轮廓)和不敏感的部分(例如大色块)进行分离,最终得到的结果是对每个 88 的小块得到 88 的系数矩阵。这个算法非常复杂,这里不做过多介绍。

第五步,量化,将DCT后得到的每个系数都除以量化矩阵中对应的值,然后进行取整。JPEG中压缩率的调整就是在这一步中体现的。

第六步,使用 Huffman 编码,将上一步得到的矩阵进行进一步地压缩,可以理解为使用数学方法重新组织数据,减小数据量。

上面这些步骤完成之后,再加上一些必要的其他信息(量化矩阵和Huffman的信息,这两个信息需要写入到文件中),就得到了最终的JPEG数据。

整个过程十分复杂,涉及到很多数学和算法知识,并没有详细解释,毕竟这系列文章只是为了入门(我也不会)。

其他图片格式

BMP

BMP是Windows操作系统中的标准图像文件格式,能够被多种 Windows 应用程序所支持。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点:占用磁盘空间过大。所以,目前BMP在只在单机上比较流行,很少用于网络。

GIF

GIF的全称是 Graphics Interchange Format,可译为图形交换格式,采用的是Lempel-Zev-Welch(LZW)压缩算法,最高支持256种颜色。由于这种特性,GIF比较适用于色彩较少的图片。如果碰到需要用复杂彩色的场合,那么GIF的表现力就有限了。但其实GIF最大的优点是支持动态图像,GIF可以包含多张图片,按照时间顺序切换,形成动图。

TIFF

TIFF(Tag Image File Format)图像文件是图像处理中常用的格式之一,其图像格式很复杂,但由于它对图像信息的存放灵活多变,可以支持很多色彩系统,而且独立于操作系统,因此得到了广泛应用。很多专业图片处理软件都支持到处 TIFF 图片格式,并且经常作为不同软件的图像交换中间格式。

PNG

PNG(Portable Network Frame 便携式网络图形)是一种无损压缩的位图片形格式,其设计目的是试图替代 GIF 和 TIFF 文件格式,同时增加一些 GIF 文件格式所不具备的特性。PNG 图片最大的两个优点是:

  1. 无损压缩:PNG文件采用LZ77算法的派生算法进行压缩,其结果是获得高的压缩比,不损失数据。它利用特殊的编码方法标记重复出现的数据,因而对图像的颜色没有影响,也不产生颜色的损失,这样就可以重复保存而不降低图像质量。
  2. 支持透明效果:PNG可以为图像定义256个透明层次,使得彩色图像的边缘能与任何背景平滑地融合,从而彻底地消除锯齿边缘。这种功能是JPEG,GIF 和 JPEG 没有的。为了描述这种透明效果,PNG 原有的 RGB 三通道上,增加了 8 bit 的 Alpha 通道(透明通道)。支持透明会增大图片体积,不过这是个可选的选项。

由于 PNG 的优秀特性,它在网络中以及各种操作系统中都十分常用。

相关标签: 音视频开发