【问题标题】:Can a high quality JPEG be converted to a low quality JPEG without decoding it?高质量的 JPEG 可以在不解码的情况下转换为低质量的 JPEG 吗?
【发布时间】:2013-08-15 08:28:57
【问题描述】:

我有一个可提供高质量 MJPEG 的网络摄像头。

我需要通过网络发送小型、低质量的 JPEG。我的硬件是 Raspberry Pi (700MHz ARM)。我希望代码使用尽可能少的 CPU 资源,并尽可能减少延迟。我可以对每一帧进行解码和重新编码,但这可能很浪费......

在逻辑上可以不解码就降低 JPEG 图像的质量吗?

即我可以找到并删除“细粒度”数据块,然后修复字段长度和校验和吗?

【问题讨论】:

  • 如果您正在尝试类似this 的内容,您可以在-qraspistill 的参数的帮助下将相机配置为输出质量较低的JPEG。

标签: c image jpeg raspberry-pi


【解决方案1】:

理论上是的。

但实际上,任何能够做到这一点的系统都能够在合理的时间内对 jpeg 进行解码和重新编码。

任何试图直接降低 jpeg 质量的代码都需要有以下两个阶段:

第一阶段。解析 jpeg 文件以识别各种标记和有效负载。
Phase2。剥离有效载荷的高熵部分并准备新文件。

  • 上面的 Phase1 将具有 jpeg 解码器的复杂性。

  • 任何潜在的性能提升都必须通过实施 Phase2 来获得,以比 jpeg 编码在较低 Q 值下执行得更快。这不是一个有吸引力的提议,因为编码时间会随着 Q 因子的降低而减少2。换句话说,以较低 Q 因子编码图像数据几乎总是比尝试剥离以较高 Q 因子编码的图像数据更快。


另一种方法(类似于您的想法)可以很好地处理 jpeg 图像的子集 - 渐进式 JPEG(顺便说一下,就是 awesome)。

在渐进式 JPEG 图像中,组件在多次扫描中进行编码。每个组件的压缩数据最少放置 2 次,最多 896 次扫描。初始扫描创建图像的粗略版本,而后续扫描对其进行细化。

本质上,扫描次数决定了 jpeg 的质量,因为后一次扫描通过在图像中添加细粒度的高熵信息来改进之前的扫描。

在 jpeg 流中,每次扫描都由一个 SOS(扫描开始标记)表示,它本质上是 2 个字节 0xFF0xDA,后跟有效负载,即包含在该特定扫描(或“切片”中的编码数据) " 在技术上是准确的)。

要减小渐进式 jpeg 的大小,可以简单地从 jpeg 文件中读取预定数量的扫描/切片,然后以质量为代价删除后者。这可以在从文件中读取 jpeg 数据时实现,或者稍后在编码数据的单次传递中实现。


参考文献 :
1.en.wikipedia.org/wiki/JPEG.
2. 格雷戈里·K·华莱士。 JPEG 静态图片压缩标准。通讯 ACM,34(10),1991 年 10 月。
3.ece.ucdavis.edu/cerl/ReliableJPEG/Cung/jpeg.html

【讨论】:

  • 事先保证所有的JPEG都是渐进式的绝对是最好的方法;通过 5 次扫描,您可以轻松地动态调整正在发送的位。遗憾的是,并非总是可行。
  • 但是,我想说您对阶段 1 和阶段 2 的复杂性是错误的,因为 IDCT 和 DCT 加上两个 RGBYUV 转换是复杂性的 80-90%。解码、去量化、重新量化和编码要快得多,而且数学非常简单。 JPEG 已经有一段时间没有受 CPU 限制了,但在过去很常见;它的质量也比仅仅降低渐进式等系数略高。
【解决方案2】:

感谢您提出评论。

嗯,Motion-JPEG 实际上是可用的最高质量的运动图像格式, 具有很大的深加工和转化潜力,目前正在 远未实现。

有几个方面需要考虑,我可以在这里举三个具体的例子。

首先,通过在汇编器级别对 JPEG 编解码器进行特定于平台的优化,可以极大地提高运行时性能,如下所示:

通过针对特定 ARM 平台的极端软件优化,该应用程序的速度甚至超过了此设备上为此目的的专用硬件解决方案!

其次,有一些应用程序可以通过优化量化表来显着减小相同分辨率和相同明显质量的给定 JPEG 图像的大小。 搜索 ThinPic App 和 JPEGmini(看来我不允许发布更多链接 在这里)。

这些都是商业产品,因此没有可用的免费源代码。

第三,我需要降低给定 Motion-JPEG 文件的分辨率。 它们是在数码相机上以 1280x720 拍摄的,我想在窗口中播放它们 在 640x360 的半尺寸屏幕上显示。

我使用 JPEG 8 引入的新 SmartScale 功能来实现这种减少,而无需 通过简单地切断 DCT 模块的高频系数来损失质量。 结果文件大小的减少不是很大(大约小 20%), 但是使用 4x4 DCT 而不是播放 640x360 的要求要低得多 1280x720,8x8 DCT。

转码是使用特别改编的 VirtualDubjpegtran 源代码完成的 (IJG 代码的新内存源和目标管理器是随 这个用例)。播放是通过特别改编的 ffdshow 源代码完成的。 这是一个用于演示的实验设置,远非可分发状态。

问候, 吉多伏尔贝丁, 组织者独立 JPEG 组

【讨论】:

  • 感谢您的信息。 JPEGmini/ThinPic 之类的功能似乎很容易实现(但不确定编码器的性能)。 Apparently,他们所做的只是将 Q 因子降低到 83% 左右,启用 Huffman 优化并使用一些自定义量化表”。Smartscale 功能听起来最有前途。
  • 感谢 Guido 的回答和电子邮件链接。我要做的是最大限度地减少微小 JPEG 图像流的延迟,这些图像通过 UDP 从带有 USB 网络摄像头的 Raspberry Pi 发送。我应该解释说我正在寻找 C 库,而不是在线服务。
  • 问题是他们如何确定自定义量化表。他们似乎将此作为他们的商业秘密。 SmartScale 更适合注重图像质量的人,而不是位计数器。
  • 我知道并且我正在开发 IJG JPEG 库(我们现在在 generation 9),但我想向您展示 JPEG 技术仍有很大的潜力尚未在可用的 C 库中实现。想象一下,如果你结合了所有提到的三个功能,结果会怎样!!!
猜你喜欢
  • 2014-04-09
  • 1970-01-01
  • 2015-07-09
  • 2011-11-12
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
相关资源
最近更新 更多