【问题标题】:Simple 2-color differential image compression简单的 2 色差分图像压缩
【发布时间】:2010-05-06 17:40:08
【问题描述】:

是否有一个高效、快速和简单的差分黑白图像压缩示例?或者更好的是,一些简单的(但无损 - 锯齿状的 1bpp 图像在使用有损压缩进行压缩时看起来不太令人信服)流技术,可以接受多个帧作为输入?

我有一个简单的黑白图像 (320x200) 流,显示类似于 LED 显示屏的内容,使用 AJAX 大约每秒更新一次。图像大部分时间都非常相似,所以如果我减去它们,结果会很好地压缩(即使使用简单的 RLE)。有这样的东西吗?

【问题讨论】:

  • 图像是否仅存储为每像素一位?
  • 这是他们的位深度,是的。它们在内存中的实际表示可以根据需要进行修改(由于我使用的是 .NET,因此有时它们是具有 1bpp 深度的托管 .NET Image 对象)。但它是一堆图像,而不是视频流。
  • 我确信这不是最有效的方法,但我会考虑每字节 1 个像素并对两帧进行异或。其值更改的所有位将为 1,大多数位将为零。然后对结果数组进行游程编码。 -- 但是,如果你丢掉任何帧,这将表现不佳。
  • 使用 1bpp 会自动将数据缩小 8 倍。如果您切换到 8bpp,不确定是否有许多压缩方法可以超越这一点。
  • @Nyerguds:任何数据,除非是纯噪声,通常都可以压缩。 8bpp 的 gif 通常会小于 1bpp 的位图,因为它使用了压缩。

标签: c# image compression video-streaming


【解决方案1】:

除了通过 gzip 或其他一些无损压缩算法运行它之外,我不知道任何已经存在的库可以满足您的要求。但是,由于您知道帧是高度相关的,因此您可以像 Conspicuous Compiler 建议的那样对帧进行异或运算,然后对其运行 gzip。如果帧之间的变化很少,则 XOR 的结果应该比原始帧的熵少很多。这将允许 gzip 或其他无损压缩算法实现更高的压缩比。

您还希望每隔一段时间发送一个关键(非差分)帧,以便在发生错误时重新同步。

如果您只是对了解压缩感兴趣,可以尝试在对帧进行异或后实现 RLE。查看页面一半左右讨论的位级 RLE here。它应该很容易实现,因为它只是在每个字节中存储一个 7 位长度和一个位值,因此如果帧之间没有变化,它可以实现 128/8=16 的最佳压缩比。

另一个想法是,如果更改很少,您可能只想对在帧之间翻转的位位置进行编码。您可以使用 16 位整数来处理 320x200 图像。例如,如果只有 100 个像素发生变化,您可以只存储 100 个 16 位整数,代表那些位置(1600 位),其中上面讨论的 RLE 至少需要 64000/16=4000 位(可能会更高一些) .您实际上可以根据帧内容在此方法和 RLE 之间切换。

如果您想超越简单的方法,我建议使用可变长度代码来表示运行长度编码期间可能的运行。然后,您可以将较短的代码分配给概率最高的运行。在执行有损压缩部分(DCT 和量化)之后,这将类似于 JPEG 或 MPEG 中使用的 RLE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2019-08-30
    • 2015-01-05
    • 2017-09-19
    • 2015-02-03
    • 1970-01-01
    相关资源
    最近更新 更多