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

有一个简单的算法,我可以使用无损压缩的像素数据?

我首先想到计算两个连续像素之间的差,然后用编码的霍夫曼码本的差异。不幸的是,像素为16位无符号数量等方面差异可以在范围-65535 .. +65535在任何地方,这导致潜在的巨大的码字长度。如果一些很长的码字出现在一排,我会遇到缓冲区溢出问题。

更新:我的平台是一个FPGA

有帮助吗?

解决方案

PNG 使用标准提供免费的,开源的,无损图像压缩标准格式工具。 PNG使用zlib作为其压缩的一部分。还有一个libpng。除非你的平台的非常的不寻常的,它不应该是很难端口的代码吧。

其他提示

有多少资源,你准备好您的嵌入式平台?

莫非你口 zlib的并做gzip压缩?即使资源有限,你应该能够端口像或LZ88

有多种可用的图像压缩库。例如,此页面列出不过库/工具包PNG图像。哪种格式/库最适合你将最有可能取决于你下工作的特殊资源限制(特别是嵌入式系统是否能够执行浮点运算)。

与无损压缩的目标是能够基于先前像素来预测下一个像素,然后进行编码的预测和像素的实际值之间的差。这是你最初的想法去做,但你只能使用一个以前的像素,使预测,未来像素将是相同的。

请记住,如果你把所有以前的像素,你不只是前面的像素更多的相关信息。也就是说,如果你想预测X的值,你应该使用Ø像素:

.. OOO ...,点击 ..OX

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

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

相反,你会做的操作系统上预测的基础。

如何“无损”你需要什么?结果 如果这是真实的扫描器,存在对带宽/分辨率的限制,以便即使它可以发送+/- 64K值可能非物理邻近像素具有多于比方说8位的差异。

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

此将涂抹出的峰,但它可以是任何的峰值超过“N'bits是噪声反正。

有一个良好的LZ77 / RLE铃铛和wwhistles混合可以得到美妙的压缩是相当快的解压缩。他们也将在更小的文件更大,更坏的压缩机由于缺乏图书馆的开销。对于一个良好的,但这个GPLd implentation,请 PUCrunch

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top