再一次问好! 我发现这篇文章写于 2019 年 XNUMX 月。 这是有关 WAVE 和 JPEG 的一系列文章的续篇,在这里
一段历史
一汤匙维基百科文章:
JPEG(联合图像专家组)是一种流行的光栅图形格式,用于存储照片和类似图像。
该标准由联合摄影专家组于 1991 年开发,旨在实现高效图像压缩。
图像如何从原始格式转换为 JPEG?
有些人认为JPEG图像是使用Huffman方法压缩的原始数据,但事实并非如此。 在控制压缩之前,数据会传输很长的距离。
首先,颜色模型从RGB更改为YCbCr。 甚至有一个特殊的算法:
对图像要做的第一件事是 “变薄” (二次抽样)。 很容易理解:取一个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)-
主要准备部分
Dkp
现在是最难也是最必要的部分。 整个图像被分为8x8的块(如果分辨率不是块边的倍数则使用填充)。
现在应用到每个块 DCT(离散余弦变换)。 在这一部分中,所有不必要的东西都被剔除了。 使用 DCT,您需要了解给定块 (8×8) 是否描述了图像的任何单调部分:天空、墙壁; 或者它包含复杂的结构(头发、符号等)。 逻辑上,64 个相似颜色的像素可以仅用 1 来描述,因为块大小是已知的。 压缩就这么多:64 比 1。
DCT将块变成频谱,在读数急剧变化的地方,系数变为正值,过渡越急剧,输出就越高。 在系数较高的地方,图片显示颜色和亮度的清晰过渡,在系数较低的地方,块中 YCbCr 分量的值变化较弱(平滑)。
量化
此处已应用压缩设置。 每个 8x8 矩阵中的每个系数都除以某个数字。 如果在进行所有修改后不会降低图像质量,则除数应该为 1。 如果这张照片占用的内存对你来说更重要,那么除数会大于XNUMX,商会四舍五入。 事实证明,四舍五入后通常会得到很多零。
进行量化是为了创造更大压缩的可能性。 以下是使用量化图 y = sin(x) 的示例:
压缩
首先,我们以锯齿形模式遍历矩阵:
我们得到一个包含数字的一维数组。 我们看到里面有很多零,可以去掉。 为此,我们输入 1 个零,并在其后输入一个数字,表示它们在序列中的编号,而不是许多零的序列。 这样你就可以重置为整个数组大小的 1/3。 然后我们简单地使用霍夫曼方法压缩这个数组并将其写入文件本身。
使用的地方
到处。 与 PNG 一样,JPEG 用于相机、操作系统(如公司徽标、应用程序图标、缩略图)以及需要有效存储图像的所有可能领域。
结论
目前,有关 JPEG 的知识仅对教育目的有价值,因为它已经随处可见并被大量人员优化,但科学的花岗岩仍然很美味。
来源
来源: habr.com