通过算术编码处理图像压缩的最佳方法是什么?

what is the best way to deal with a image for compression by Arithmetic coding?

我一直在 node js 进行一个压缩 .txt 文件的项目。到目前为止,我已经通过对 encodingdecoding 数据使用 Arithmetic coding 成功实现了该目标,但现在我想使用该代码来压缩图像,但我不知道如何实现要做到这一点。我的主要问题是我应该如何从图像中读取数据进行压缩。我完全不知道如何使用 Bufferstream 甚至 Blob 来做到这一点(通过有时搜索兴趣论文是可能的方法)。

我知道在 Python 中处理图像非常容易,所以我虽然制作了脚本来使用 python 读取图像。目前我还没有整合 PythonNode js 这将在后面的步骤中进行。

我对某些 python 库(如 open-csvPillow (PIL) 的经验很少。到目前为止,我已经使用 cv2.imread() 函数读取图像并将其作为 binary 存储在 .txt 文件中。至于现在我还没有将它与 Node js.

集成
from cv2 import cv2

img1 = cv2.imread('cat.png',0)

with open("cat.txt", 'wb') as out:
    out.write(img1.tobytes())

现在我使用 cat.txt 文件并通过 fsnode js 中读取该数据然后压缩和解压缩它 通过 Arithmetic coding.

现在主要问题:

When i read image in python and store it in cat.txt it's size is quite bigger than cat.png file. Even such that after compressing that cat.txt file the resultant compressed_cat.txt is bigger than that of cat.png.

cat.png = 242kb, cat.txt(before compression) = 971kb, compressed_cat.txt(after compression) = 251kb

我想我正在错误地读取或存储文件。我不知道如何克服这个问题。

需要一些额外的帮助

我没有完整的答案,但我认为以下信息会有所帮助 -

.png、.jpg 等图像格式已经以压缩格式表示图像。有些不是有损的,但最常用于存储的是有损的以最小化尺寸。所以,老实说,我怀疑任何文本压缩算法都可以击败现有的图像压缩格式。

我认为您的方法有一个错误是使用 open-cv 读取图像。如果我没记错的话,它会为您提供图像的 multi-dimentional 数组表示形式。如果你想使用图像,那很好,但我认为你只想直接从图像文件中读取字节,这样你就可以将它转换回原始图像文件。现在,您如何使用字节或底层位取决于您。我希望这能回答您的部分问题。

我在寻找解决方案的方向错误。但是 评论帮助了 I think you just want to read the bytes from image file directly, so you can convert it back to the original image file。 我做了 2 大改变

首先是读图方式

我不需要 python 到 read/write 图像,因为它可以在 node-js 中轻松完成。

const fs = require("fs");

let data = fs.readFileSync('Cat.png', 'binary');

fs.writeFileSync('Cat_Copy.png', data, 'binary');

第二次选择要压缩的正确文件

Mostly .jpeg, .jpgand .png are already compressed so normal compression techniques does not work on them. But .tiff files are not compressed and at least my algorithm works on this format. Still it is not very efficient.

第三选择正确的格式保存压缩文件

Well that was not a big problem as we can save it without any extension what does really matters is the encoding in which it is saved. Well in js ucs2 takes less space on disk than utf8. I am saving it as filename.ac as it represents Arithmetic Coding.