你好! 我发现这篇文章写于2019年5月。 这是有关WAVE和JPEG的一系列文章的续篇,这是第一篇 。 该出版物将包括有关图像编码算法和格式本身的信息。
一小撮历史
一汤匙的维基百科文章:
JPEG(联合图像专家组)是用于存储照片图像和类似图像的流行栅格图形格式之一。
该标准是由联合图像专家组于1991年开发的,用于有效的图像压缩。
哪些路径从原始到jpeg
有人认为JPEG图像是通过霍夫曼方法压缩的原始数据,但事实并非如此。 在进行控制压缩之前,数据需要很长的路要走。
首先,颜色模型从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个像素的行中执行。 第一个选项使用得更频繁。 如果图像质量很重要,则根本不执行间隔剔除。
细化的可视化插图(Habr不允许插入gif)-https://i.ibb.co/Rg5Th9H/150953010617579181.gif
准备的大部分
DCT
现在是最困难和必要的部分。 整个图片分为8x8的块(如果分辨率不是块边的倍数,请使用填充)。
现在,对于每个块,将应用DCT(离散余弦变换) 。 在这一部分中,所有多余的部分都被排除在图片之外。 使用DCT,有必要了解此块(8x8)是否描述了图像的任何单调部分:天空,墙壁; 或者它包含一个复杂的结构(头发,字符等)。 逻辑上可以在一个像素中描述64个相似的彩色像素,因为 块大小是已知的。 压缩量很大:64比1。
DCT将一个块变成一个频谱,在读数突然变化的地方,系数变为正值,跃迁越陡,输出就越高。 系数较高的地方,图片显示颜色和亮度的清晰过渡,而系数较低的地方-块中YCbCr分量值的微弱(平滑)变化。
量化
已经应用了压缩设置。 将每个8x8矩阵中的每个系数除以一定数量。 如果经过所有修改后图像质量不会降低更多,则分频器应为一。 如果此照片占用的内存对您来说更重要,则除数将大于1,并且商将被四舍五入。 因此,事实证明,在四舍五入后,通常会得出许多零。
进行量化以创建更多压缩。 这是图形y = sin(x)的量化示例的外观:

压缩方式
首先我们看一下之字形矩阵:

我们得到一个带有数字的一维数组。 我们看到其中有许多零,可以将其删除。 为此,我们输入一个1零,而不是一个多个零的序列,然后在其后输入一个数字,指示该序列中的数字。 因此,您可以将其重置为整个阵列大小的1/3。 然后,它仅使用Huffman方法压缩此数组,然后将其输入文件本身。
在哪里使用
无处不在。 像PNG一样,JPEG用于相机,操作系统(作为公司徽标,应用程序图标,缩略图)以及需要有效存储图像的所有可能区域。
结论
目前,有关JPEG的知识仅对教育用途有价值,因为它已经被许多人内置并在各处进行了优化。 但是科学的花岗岩还是很美味的 。
资料来源
维基百科有关YCbCr的文章
维基百科上的JPEG文章
关于Picabu职位的DCT的一些知识
DCT在Wikipedia上的文章