简单的双色差分图像压缩

时间:2010-05-06 17:40:08

标签: c# image compression video-streaming

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

我有一个简单的黑白图像(320x200)流,显示类似于LED显示的东西,使用AJAX每秒更新一次。图像在大多数情况下非常相似,所以如果我减去它们,结果会很好地压缩(即使使用简单的RLE)。是这样的吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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