JPEG。 压缩算法

再一次问好! 我发现这篇文章写于 2019 年 XNUMX 月。 这是有关 WAVE 和 JPEG 的一系列文章的续篇,在这里 第一。 本出版物将包含有关图像编码算法和格式本身的整体信息。

一段历史

一汤匙维基百科文章:

JPEG(联合图像专家组)是一种流行的光栅图形格式,用于存储照片和类似图像。

该标准由联合摄影专家组于 1991 年开发,旨在实现高效图像压缩。

图像如何从原始格式转换为 JPEG?

有些人认为JPEG图像是使用Huffman方法压缩的原始数据,但事实并非如此。 在控制压缩之前,数据会传输很长的距离。

首先,颜色模型从RGB更改为YCbCr。 甚至有一个特殊的算法: 这里。 Y 没有被触及,因为它负责亮度,并且它的变化会很明显。

对图像要做的第一件事是 “变薄” (二次抽样)。 很容易理解:取一个2x2的像素数组,然后取Cb和Cr——这4个像素的每个YCbCr分量的平均值。 所以, 我们赢得了 6 个字节,而不是 4 Y、4 Cb、4 Cr,我们得到 4 Y 以及它们每个的相同 Cb 和 Cr (4 + 4 + 4 = 12;4 + 1 + 1 = 6;12 - 6 = 6)。 即使在 2x2 比例下,具有 2:1 压缩比的有损压缩听起来也很可靠。 这适用于整个图像。 所以 - 他们缩小了一半尺寸。 由于我们的颜色感知,我们可以使用这种技术。 如果对一小块像素进行平均,人们会很容易注意到亮度的差异,但不会注意到颜色的差异。 细化也可以在一条线上进行,水平和垂直各 4 个像素。 第一个选项使用得更频繁。 如果图像质量很重要,则根本不执行抽取。
稀疏化的直观说明(哈布尔不允许我插入 gif)- https://i.ibb.co/Rg5Th9H/150953010617579181.gif

主要准备部分

Dkp

现在是最难也是最必要的部分。 整个图像被分为8x8的块(如果分辨率不是块边的倍数则使用填充)。

现在应用到每个块 DCT(离散余弦变换)。 在这一部分中,所有不必要的东西都被剔除了。 使用 DCT,您需要了解给定块 (8×8) 是否描述了图像的任何单调部分:天空、墙壁; 或者它包含复杂的结构(头发、符号等)。 逻辑上,64 个相似颜色的像素可以仅用 1 来描述,因为块大小是已知的。 压缩就这么多:64 比 1。

DCT将块变成频谱,在读数急剧变化的地方,系数变为正值,过渡越急剧,输出就越高。 在系数较高的地方,图片显示颜色和亮度的清晰过渡,在系数较低的地方,块中 YCbCr 分量的值变化较弱(平滑)。

量化

此处已应用压缩设置。 每个 8x8 矩阵中的每个系数都除以某个数字。 如果在进行所有修改后不会降低图像质量,则除数应该为 1。 如果这张照片占用的内存对你来说更重要,那么除数会大于XNUMX,商会四舍五入。 事实证明,四舍五入后通常会得到很多零。

进行量化是为了创造更大压缩的可能性。 以下是使用量化图 y = sin(x) 的示例:

JPEG。 压缩算法

压缩

首先,我们以锯齿形模式遍历矩阵:

JPEG。 压缩算法

我们得到一个包含数字的一维数组。 我们看到里面有很多零,可以去掉。 为此,我们输入 1 个零,并在其后输入一个数字,表示它们在序列中的编号,而不是许多零的序列。 这样你就可以重置为整个数组大小的 1/3。 然后我们简单地使用霍夫曼方法压缩这个数组并将其写入文件本身。

使用的地方

到处。 与 PNG 一样,JPEG 用于相机、操作系统(如公司徽标、应用程序图标、缩略图)以及需要有效存储图像的所有可能领域。

结论

目前,有关 JPEG 的知识仅对教育目的有价值,因为它已经随处可见并被大量人员优化,但科学的花岗岩仍然很美味。

来源

维基百科上有关 YCbCr 的文章
维基百科有关 JPEG 的文章
Pikabu 帖子中有关 PrEP 的一些信息
维基百科关于 PrEP 的文章

来源: habr.com

添加评论