有比JPEG更快的有损压缩方法吗?

7

是否有一种比JPEG更快但得到很好支持的压缩算法?我知道jpeg2000,但据我所知它并没有快很多。

编辑:用于压缩。

编辑2:它应该在Linux 32位上运行,并且最好使用C或C++。


1
解压缩还是压缩? - tenfour
只是好奇,为什么需要压缩图像?需要压缩多少? - Mark Ransom
@Mark Ransom:嗯,我需要将它们压缩以便从具有500Mhz CPU和256MB RAM的小型人形机器人通过UDP发送到PC进行处理。我需要达到至少每秒20张图像,并且WiFi适配器不足以在1秒内发送那么多数据,因此我正在使用JPEG来减少带宽。 - Richard Knop
2
使用视频编解码器比管理单个完整帧更为合适。 - Steve-o
6个回答

4

Jpeg的编码和解码应该是非常快的。你很难找到更快的算法。如果速度缓慢,问题可能不在格式上,而是编码器的实现不佳。尝试使用ffmpeg项目中的libavcodec编码器。


JPEG编码旨在快速解码。这并不总是意味着它也具有快速编码(事实上,很多时候它的编码速度要慢得多)。 - Zac Howland
如果你不追求最佳编码,两者都非常快。在过去几年中,低端的x86应该能够以每秒30兆像素或更快的速度对jpeg进行编码(这只是我粗略估计的数字)。 - R.. GitHub STOP HELPING ICE
一个用于视频编码的编码器肯定会被优化为速度。我知道多年来MJPEG一直非常快,尽管我一直认为需要专门的硬件才能实现这一点。 - Mark Ransom
我认为OpenCV是你的问题所在。即使我的旧K6 450 MHz也可以以25-30 fps编码640x480 JPEG。当然,我使用的是YUV源而不是RGB。如果有任何方法可以安排源图像为YUV,那将会很有帮助。如果没有,确保你使用快速转换例程。ffmpeg中的libswscale是我知道的最快的。 - R.. GitHub STOP HELPING ICE
2
希望能够在编码640*480的YUV422图像时达到0.05秒,这意味着20帧每秒。我希望在500Mhz的CPU上实现这个目标是现实的。 - Richard Knop
显示剩余3条评论

3

你的目标架构是否支持MMX/SSE2指令?如果支持,可以尝试使用libjpeg-turbo。或者,你可以使用类似于zlib的工具对图像进行压缩,然后将实际的减少操作转移到另一台设备上处理。是否必须在嵌入式设备本身上进行实际的有损压缩呢?


libjpeg-turbo的许可证是LGPL,不适用于商业或真正的开源项目。 - Matthieu N.
zlib 压缩比 jpeg 压缩慢几倍。 - R.. GitHub STOP HELPING ICE
PNG使用zlib压缩。Zlib在嵌入式方面存在问题,代码不太符合32/64位规范,交叉编译效果也不好,并且在默认配置下需要大量RAM。这取决于你的嵌入式程度。 - old_timer
你可以在嵌入式系统中使用busybox实现,但我不确定它的性能如何。 - R.. GitHub STOP HELPING ICE

2
在什么情况下?在个人电脑还是便携设备上?
根据我的经验,广泛使用的图像类型有JPEG、JPEG2000、PNG等选项(无论是否有损!)
(好消息是GIF正在退出历史舞台。)

我认为JPEG2000并不普遍,因此列表实际上只包括JPEG和PNG。 - Jonathan Grynspan
LZW算法的专利在欧洲部分地区已经过期,因此除了其有限的色彩空间之外,没有真正避免使用GIF的理由。而这可以被规避(虽然相当丑陋)。 - onemasse
这是为嵌入式Linux机器人设计的。 - Richard Knop
TIFF 似乎仍然存在,我在使用扫描仪时总是遇到它。而且它是一种非损失压缩格式。 - old_timer
DCT压缩的图像可以放入TIFF容器中,因此从技术上讲,TIFF可以是有损或无损的。但这并不改变基本观察结果,即DCT几乎是有损图像压缩中唯一的选择。 - zwol

2
JPEG2000并不比JPEG快。是JPEG的编码或解码速度不够快吗?你可以尝试在JPEG上仅使用4x4的FDCT和IDCT来提高速度。
很难找到关于IJG libjpeg的任何文档,但如果您使用它,请尝试降低质量设置,这可能会使其更快,此外还有一个快速的FDCT选项。
有人提到了libjpeg-turbo,它使用SIMD指令,并且与常规的libjpeg兼容。如果您可以选择,我认为您应该尝试它。

将二进制图像编码为JPEG在我的嵌入式Linux机器人上速度太慢了。 - Richard Knop
@Richard Knop:二进制?就是黑白没有灰色和彩色的那种吗?这可大有不同。 - Mark Ransom
@Mark Ransom 我使用二进制图像作为“原始”图像。它们是彩色的。 - Richard Knop

1

我认为基于小波的压缩算法通常比使用DCT的算法慢。也许你应该看看JPEG XR和WebP格式。


1

如果您不需要完整的图像保真度,可以将图像简单地调整为较小的尺寸。将每个2x2块平均到一个像素中将快速将大小减小为1/4。


除非你编写了一些极其优化的代码来进行缩小,否则使用libavcodec执行jpeg压缩的时间可能比你的缩小代码要少。 - R.. GitHub STOP HELPING ICE
@R,我建议的算法不是非常容易进行极致优化吗? - Mark Ransom
如果你用汇编语言写的话,可能会比libavcodec的jpeg编码器更好,但是我怀疑使用纯C实现的缩放算法能否在当前的编译器技术下击败libavcodec的jpeg编码器。 - R.. GitHub STOP HELPING ICE
@R,有趣。我可能得自己试一下。 - Mark Ransom
在进行下采样之前,您需要(低通)滤波处理,这将是昂贵的部分。(平均是一种非常差的低通滤波器。) - Paul R
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接