图像压缩 - 离散余弦变换后的锯齿形

Image compressing - zigzag after Discrete Cosine Transform

我正在尝试制作压缩来自相机的图像的应用程序。我有 mat 图像和 3 个单独的通道数组。我发现了一些关于离散余弦变换的东西 DCT and read that I should do zigzag algorithm (I've found something with zigzag here).
我知道 DCT 生成输出数组,但我看不到之字形是否也生成一个数组,以及在哪里。
也许有一些带有输入和输出数组的锯齿形算法(或带有锯齿形的 dct)的简单示例?

图片来自this wikipedia article.

TL,DR:请参阅下面的 粗体 部分。

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

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

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

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

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

zigzag的目的是将量化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 个原始像素值。

请注意,在切断之字形输出后还有额外的压缩步骤。这些在链接文章中有描述。