Image 哈夫曼压缩图像

Image 哈夫曼压缩图像,image,compression,huffman-code,Image,Compression,Huffman Code,我正在做一个我想做很久的项目。我想制作一个全方位的哈夫曼压缩器,它不仅在理论上可以对各种类型的文件工作,而且我正在用python: 文本——由于明显的原因,它是易于实现的,已经完成,工作非常出色 图像-这是我挣扎的地方。我不知道如何处理图像,以及如何以一种简单的方式阅读它们,这实际上可以帮助我轻松地压缩它们。 我试着一个像素一个像素地读,但不知怎么的,它实际上放大了图片,而不是压缩它 我所尝试的: 使用图像(PIL)逐像素读取图像,获取列表中的所有像素,为每个像素创建一个频率表,然后对其进行加密

我正在做一个我想做很久的项目。我想制作一个全方位的哈夫曼压缩器,它不仅在理论上可以对各种类型的文件工作,而且我正在用python:

文本——由于明显的原因,它是易于实现的,已经完成,工作非常出色

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

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

我想我可以通过读取更大的像素集或类似的东西来解决这个问题,因为这样我就有了更小的代码表,因此哈夫曼代码就不那么长了。如果我这样做,理论上我可以得到255^3大小的代码表(因为每个像素是(0-255,0-255,0-255))

有没有办法一次读取更多的像素(>1像素),或者在只需要压缩的情况下,有没有更好的方法接近图像?

感谢大家阅读到目前为止,并特别感谢所有试图伸出援手的人


编辑:如果哈夫曼是一个非常糟糕的图像压缩算法,有没有更好的,你可以考虑吗?如果有必要,我正在进行的项目可以针对不同的文件类型采用不同的算法。

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


但正如你所怀疑的,仅仅利用0阶熵对许多图像来说并不是很好,尤其是照片。作为一些现有格式的示例,PNG使用空间相关性(非常适合平滑渐变),JPG使用量化离散余弦变换和(通常)到YCbCr的颜色空间变换(去相关通道,比Luma更无情地粉碎色度)和(通常)色度子采样,JPEG2000以有损和无损的形式使用小波和颜色空间变换(虽然不同的小波和不同的颜色空间变换),并且还支持二次采样,尽管降低小波比例可以获得类似的效果。

您的意思是说您读取了一整个像素,其完整的24位亮度,“你在用这些做频率表吗?”哈罗德,我想是的。我正在使用python中的库PIL,并通过img访问每个所谓的“像素”[I,j]如何在PIL中将图像分割为R、G和B颜色平面?@kuyy我不知道任何直接执行的好方法,但通过numpy数组可以使用切片。最坏的情况是,你可以在所有像素上循环并解构它们。
Image.split()