1

我有一系列图像。每个通常(但不总是)与前一个相似,更新了 3 或 4 个小矩形区域。我需要使用最少的磁盘空间来记录这些更改。

源图像未压缩,但我希望压缩增量。

我需要能够完全按照输入重新创建图像(因此有损视频编解码器不合适。)

我正在考虑以下内容:

  • 将新图像与旧图像的负片合成
  • 以可以使用 RLE 压缩的任何常用格式(可能是 PNG)保存合成图像。
  • 通过将前一个图像与增量合成来重新创建第二个图像。

尽管图像具有 alpha 通道,但出于此功能的目的,我可以忽略它。

是否有易于实现的算法或具有此功能的免费 Java 库?

4

3 回答 3

1

在仅包含更改的图像上使用现有的无损压缩器(PNG、无损 JPEG 等)进行一些试验(您可以为 PNG 使用透明背景,或使用一些统一的颜色)。这些算法在压缩大部分恒定的图像时非常有效,如果您不是专家,您将无法击败它们。

于 2010-03-31T03:55:58.833 回答
1

如果矩形的数量通常很小,并且矩形本身很小,您可以找出不同的行和列,用它来得出可能不同的矩形......

想象一下具有以下像素值的图像......

0 0 0 1 1 1 2 2 3 3
0 0 1 1 0 0 1 1 2 2
0 0 1 1 0 0 0 1 1 2
0 0 1 1 0 0 0 1 1 2
0 1 1 0 0 3 0 0 1 1
0 1 1 0 0 3 0 0 1 1
0 0 1 1 0 0 0 1 1 2
0 0 1 1 0 0 0 1 1 2
0 0 0 1 1 1 1 1 0 2
2 2 2 2 2 1 1 2 2 2

...和...

0 0 0 1 1 1 2 2 3 3
0 1 1 1 0 0 1 1 2 2
0 1 2 4 0 0 0 1 1 2
0 1 2 3 0 0 0 1 1 2
0 1 1 0 0 3 0 0 1 1
0 1 1 0 0 3 0 0 1 1
0 0 1 1 0 3 3 2 1 2
0 0 1 1 0 3 3 2 1 2
0 0 0 1 1 2 2 2 0 2
2 2 2 2 2 1 1 2 2 2

首先,您会想出一个掩码,其中的像素行、行和列有差异......

    0 1 1 1 0 1 1 1 0 0

0   0 0 0 0 0 0 0 0 0 0
1   0 1 0 0 0 0 0 0 0 0
1   0 1 1 1 0 0 0 0 0 0
1   0 1 1 1 0 0 0 0 0 0
0   0 0 0 0 0 0 0 0 0 0
0   0 0 0 0 0 0 0 0 0 0
1   0 0 0 0 0 1 1 1 0 0
1   0 0 0 0 0 1 1 1 0 0
1   0 0 0 0 0 1 1 1 0 0
0   0 0 0 0 0 0 0 0 0 0

行和列数据为我们提供了关于可能存在矩形的位置的指导...

    0 1 1 1 0 1 1 1 0 0

0   0 0 0 0 0 0 0 0 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
0   0 0 0 0 0 0 0 0 0 0
0   0 0 0 0 0 0 0 0 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
1   0 ? ? ? 0 ? ? ? 0 0
0   0 0 0 0 0 0 0 0 0 0

遍历每个可能的矩形并确定是否有变化,然后对它们进行编码。如果需要,您可以添加其他散列轴而不是行和列...就像您可以将图片细分为区域并散列区域是否有任何更改,然后使用散列来决定区域是否需要被编码。您可以执行任意次数并拥有一个相当快速的算法,该算法也可以生成小文件。

无论如何,我认为你最好的选择是建立一个已更改的地图,并使用聚合来告诉你是否已更改块来指导你的决策。如果你收集了足够多的这些,你甚至可以创建几个不同的算法,在不同的情况下做得很好,然后将它们放入责任链中,根据你构建的地图的特征和哈希值来决定使用哪种算法。

于 2010-03-31T04:09:55.873 回答
0

如果更改将保持矩形,您可以分别保存这些部分,即原始图像加上更改及其位置。

于 2010-03-31T03:00:52.937 回答