使用 zlib 进行图像/字符串压缩的惊人行为

斯特凡诺

我很想知道有多少具有不同特征的图像可以被压缩而不会丢失。因此,我生成了 3 种不同类型的双层图像(全黑、黑白棋盘格和随机黑白)并使用 zlib 压缩图像。我使用 PIL(枕头)压缩到 PNG 做了同样的事情并得到了相同的结果,但为了简单起见,让我们坚持只使用 zlib(我相信 PIL 也使用 zlib)。

我执行以下操作。我生成了一个 0 和 1 的 numpy 二维数组(uint8 类型)并将其转换为字节(是的,我这样做会丢失有关数组形状的信息)。然后我将字符串传递给压缩它的 zlib,并将原始图像的大小与压缩图像的大小进行比较。我这样做是作为原始像素数(字节)的函数。一个最小的工作示例可以在这里找到高达 1024x1024 字节的压缩字节数与原始字节数如下(“原始”只是我们开始的像素总数,“comp.”代表压缩,“常量”指全0,“棋盘格”重复 101010 并在“随机”中随机采样每个像素)

压缩图像的比较

以及压缩字节与原始字节的比率(彩色线除以黑线)

在此处输入图片说明

我觉得结果很奇怪,可能是因为我不太明白 zlib 在做什么。为什么压缩率会改变?它起初非常高效,然后达到恒定速率(比率恒定)。

对于“常数”(全为0)的示例,为什么当我实质上通过添加更多的0来添加很少的信息时,压缩字符串的大小为何以这样的速率保持增长?(可以对棋盘进行类似的考虑,因为它是周期性的)

我预计压缩图像的大小与其 Kolmogorov 复杂性有些相关,但似乎并非如此。

马克·阿德勒

zlib 技术说明中所述,deflate 格式固有的最大压缩比为 1032:1。当您达到 10 -3图中的比率时,您正在饱和格式的功能

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用字节切片解压缩压缩的ZLib字符串

使用zlib在php中压缩字符串并在python中解压缩

如何使用多个线程进行zlib压缩

使用zlib.js解压缩python zlib compress

使用 zlib 解压缩 zip 文件

如何使用压缩算法进行图像压缩,即LZ4,LZMA,ZLIB swift

如何使用多个线程进行zlib压缩(相同的输入源)

在Java中使用Deflate和Inflate类进行Zlib压缩

在Python中使用gzip或zlib压缩字符串-为什么我缺少“ H4sIAAAAAAAA /”位

如何使用 gcc 在 Windows 上使用 zlib 进行编译?

使用C#打开Delphi ZLib压缩数据

使用zlib压缩boost二进制归档文件

使用 zlib + base64 [python] 压缩 numpy 数组

使用wiredtiger和zlib压缩将csv文件导入MongoDB

如何使用golang的zlib?

使用CMake构建zLib

用 zlib 重新压缩解压后的字符串

Zlib和binascii不使用Python3.6进行构建

使用zlib压缩/解压缩char数组,缺少一些字符

Zlib在python中压缩

python 3.6.3。zlib压缩

如何通过FireDac(Delphi)从FireBird数据库流式传输使用zlib压缩的图像

为什么cURL使用zlib?

使用 zlib 构建 boost::iostreams

如何使用zlib.gzipSync(buffer [,options])来压缩文件,以及如何使用zlib.gunzipSync(buffer [,options])来解压缩文件?

zlib压缩大于最大压缩

使用zlib解压缩来自TCP连接的传入数据(压缩数据)

我如何使用zlib在C中压缩并在golang中解压缩

使用DEFLATE(RFC 1951)函数压缩和解压缩zlib(RFC 1950)