【问题标题】:Huffman compression Images霍夫曼压缩图像
【发布时间】:2018-07-22 23:02:08
【问题描述】:

我正在从事一个我想做很久的项目。我想制作一个全能的霍夫曼压缩器,它不仅在理论上适用于各种类型的文件,而且我正在用 python:

编写它

文本 - 出于显而易见的原因,这是最容易实现的文本,已经完成,效果非常好。

图像 - 这是我苦苦挣扎的地方。我不知道如何处理图像以及如何以简单的方式阅读它们,它实际上可以帮助我轻松地压缩它们。 我试过逐个像素地读取它们,但不知何故,它实际上放大了图片而不是压缩它。

我尝试过的: 使用 Image(PIL) 逐像素读取图像,获取列表中的所有像素,创建一个频率表(为每个像素),然后对其进行加密。 问题是,imo,我正在读取每个像素并试图从中制作一个频率表。这样一来,我得到的符号太多了,这导致了太多冗长的霍夫曼代码(超过 8 位)。

我认为我可以通过读取更大的像素集或类似的任何东西来解决这个问题,因为这样我就会有一个更小的代码表,因此哈夫曼代码的长度也会更短。如果我保持这样,理论上我可以得到 255^3 大小的代码表(因为每个像素都是 (0-255, 0-255, 0-255))。

有没有什么方法可以一次读取大量像素(>1 个像素),或者在只需要压缩的情况下有更好的方法来处理图像吗?

感谢大家到目前为止的阅读,特别感谢任何试图伸出援手的人。

已编辑:如果 huffman 是一种非常糟糕的图像压缩算法,您还能想到更好的算法吗?如果需要,我正在做的项目可以针对不同的文件类型采用不同的算法。

【问题讨论】:

  • 您的意思是您读取了一个整个像素,在其完整的 24 位荣耀中,并且您正在从中制作频率表吗?
  • @harold 我想是的。我在 python 中使用库 PIL,并通过 img[i, j] 访问每个所谓的“像素”

标签: image compression huffman-code


【解决方案1】:

像这样对整个像素进行编码通常会导致太多独特的符号,而每个符号的使用次数都很少。特别是如果图像是照片或包含许多彩色渐变。解决此问题的一种简单方法是将图像拆分为其 R、G 和 B 颜色平面,并对它们单独或连接进行编码,无论哪种方式,被编码的实际元素都在 0..255 范围内,而不是多维的。

但正如您所怀疑的,仅利用 0 阶熵对于许多图像(尤其是照片)来说并不是那么好。作为一些现有格式的示例,PNG 使用filters 来利用空间相关性(非常适合平滑渐变),JPG 使用量化离散余弦变换和(通常)对 YCbCr 的颜色空间变换(去相关通道,为了比 Luma 更无情地粉碎 Chroma)和(通常)Chroma 二次采样,JPEG2000 使用有损和无损形式的小波和颜色空间变换(尽管不同的小波和不同的颜色空间变换),并且还支持通过丢弃小波进行二次采样scale 达到了类似的效果。

【讨论】:

  • 如何在 PIL 中将图像拆分为 R、G 和 B 色平面?
  • @kuyy 我不知道有什么直接的好方法,但是通过一个 numpy 数组,你可以使用切片。最坏的情况是你可以遍历所有像素并解构它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多