1

我正在尝试制作压缩相机图像的应用程序。我有垫子图像和 3 个单独的通道数组。我发现了一些关于离散余弦变换DCT的内容,并读到我应该做 zigzag 算法(我在这里找到了 zigzag 的东西)
我知道 DCT 制作输出数组,但我看不出 zigzag 是否也制作了一个以及在哪里制作。
也许有一些带有输入和输出数组的之字形算法(或带之字形的 dct)的简单示例?

4

1 回答 1

4

图片来自这篇维基百科文章

TL,DR:见下面的粗体部分。

从像素值的二维数组开始。有 64 个字节的信息。

在此处输入图像描述

应用偏移量并计算 DCT 后,输出是频率系数的二维数组。所以现在有 64 个浮点值。

在此处输入图像描述

这是 JPEG 压缩工作原理的关键。阵列左上角的频率系数(低频)比阵列右下角的频率系数(高频)对图像质量更重要。

所以下一步是对数组应用量化。量化为数组中的每个值分配可变数量的位。左上角的值获得更多位,右下角的值获得更少的位。量化后,数组看起来像这样。

在此处输入图像描述

请注意,右下角的许多值现在为零。所以最后我们到达了之字形,它看起来像这样:

在此处输入图像描述

之字形的目的是将量化 DCT 系数的二维数组转换为一维数组,其中第一个元素来自二维数组的左上角,后面的元素来自右下角。曲折之后,数组看起来像这样

-26 -3 0 -3 -2 -6 2 -4 1 -3 1 1 5 1 2 -1 1 -1 2 0 0 0 0 0 -1 -1 0 0 ...

其中...全为 0。根据所需的压缩程度,可以在任何点对数组进行切分。在此示例中,在 19 个元素之后对数组进行切分是质量和压缩之间的良好折衷。因此只有前 19 个元素存储在 JPEG 文件中,而不是存储原始的 64 个原始像素值。

请注意,在切割锯齿形输出后还有额外的压缩步骤。这些在链接的文章中进行了描述。

于 2018-09-05T23:02:39.037 回答