5

我有一个嵌入式应用程序,其中图像扫描仪发出一个 16 位像素流,这些像素随后被组装成灰度图像。由于我需要在本地保存这些数据并将其转发到网络接口,我想压缩数据流以减少所需的存储空间和网络带宽。

有没有一种简单的算法可以用来无损压缩像素数据?

我首先想到计算两个连续像素之间的差异,然后用霍夫曼​​代码编码这个差异。不幸的是,像素是无符号的 16 位数量,因此差异可能在 -65535 .. +65535 范围内的任何地方,这会导致潜在的巨大码字长度。如果连续出现几个非常长的代码字,我会遇到缓冲区溢出问题。

更新:我的平台是 FPGA

4

6 回答 6

8

PNG使用标准工具以标准格式提供免费、开源、无损的图像压缩。PNGzlib用作其压缩的一部分。还有一个libpng。除非您的平台非常不寻常,否则将此代码移植到它应该不难。

于 2010-04-14T01:08:43.530 回答
3

您的嵌入式平台上有多少可用资源?

你能移植zlib并进行 gzip 压缩吗?即使资源有限,您也应该能够移植LZ77 或 LZ88 之类的东西。

于 2010-04-13T14:59:54.127 回答
3

有各种各样的图像压缩库可用。例如,此页面只列出了 PNG 图像的库/工具包。哪种格式/库最适合您很可能取决于您正在处理的特定资源限制(特别是,您的嵌入式系统是否可以进行浮点运算)。

于 2010-04-14T01:39:48.973 回答
2

无损压缩的目标是能够根据之前的像素预测下一个像素,然后对预测值与像素实际值之间的差异进行编码。这是您最初想要做的,但您只使用了前一个像素并预测下一个像素将是相同的。

请记住,如果您拥有所有先前的像素,那么您将拥有比前一个像素更多的相关信息。也就是说,如果你试图预测 X 的值,你应该使用 O 像素:

..OOO...
..OX

此外,您不希望在以下情况下使用流中的前一个像素 B 来预测 X:

OO...B <-- 行
X 结束 <- 下一行开始

相反,您将根据 Os 进行预测。

于 2010-04-16T19:13:24.090 回答
1

您需要多“无损”?
如果这是一个真正的扫描仪,那么带宽/分辨率就会受到限制,因此即使它可以发送 +/-64K 值,相邻像素的差异超过 8 位也可能是非物理的。

在这种情况下,您可以为每一行做一个起始像素值,然后在每个像素之间做一个差异。

这会抹去峰值,但无论如何,任何超过“N”位的峰值都可能是噪声。

于 2010-04-16T19:17:35.237 回答
1

一个带有花里胡哨的优秀 LZ77/RLE 混合器可以获得出色的压缩效果,而且解压缩速度相当快。由于缺少库开销,它们也将是更小文件的更大、更坏的压缩器。对于一个好的但 GPLd 的实现,请查看PUCrunch

于 2010-04-20T01:06:02.873 回答