我很想知道有多少具有不同特征的图像可以被压缩而不会丢失。因此,我生成了 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] 删除。
我来说两句