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

Posted

技术标签:

【中文标题】图像压缩 - 离散余弦变换后的锯齿形【英文标题】:Image compressing - zigzag after Discrete Cosine Transform 【发布时间】:2018-09-05 21:20:29 【问题描述】:

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

【问题讨论】:

【参考方案1】:

图片来自this wikipedia article。

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 个原始像素值。

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

【讨论】:

砍你的意思是删除那些0或别的什么?它仍然是 1x64 数组吗?如果我想再次显示图像,我必须向后做所有这些吗?量化就像压缩级别? 我的意思是只有数组的第一部分(例如只有前 19 个元素)实际存储在文件中。其余的被忽略,这意味着一些信息丢失,并且无法从文件中恢复。是的,要解压,所有步骤都必须倒退。是的,量化是一种压缩级别(同样会丢失一些信息)。

以上是关于图像压缩 - 离散余弦变换后的锯齿形的主要内容,如果未能解决你的问题,请参考以下文章

图像压缩基于DCT实现图像压缩matlab源码含GUI

图像压缩基于matlab GUI DCT图像无损压缩含Matlab源码 726期

JPEG压缩原理与DCT离散余弦变换——有实际的数据演示

图像jpeg压缩

二维DCT变换

为啥 DCT 变换在视频/图像压缩中优于其他变换