Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简单但有效的方法来存储图像的一系列小更改?_Java_Image Processing_Image Comparison - Fatal编程技术网

Java 简单但有效的方法来存储图像的一系列小更改?

Java 简单但有效的方法来存储图像的一系列小更改?,java,image-processing,image-comparison,Java,Image Processing,Image Comparison,我有一系列的图片。每个区域通常(但不总是)与前一个相似,更新了3或4个小矩形区域。我需要用最少的磁盘空间记录这些更改 源图像没有被压缩,但我想三角洲被压缩 我需要能够重新创建的图像完全作为输入(所以有损视频编解码器是不合适的。) 我想到的是: 将新图像与旧图像的负片合成 以任何可以使用RLE(可能是PNG)压缩的通用格式保存合成图像 通过将前一个图像与增量合成,重新创建第二个图像 虽然图像有一个alpha通道,但出于此功能的目的,我可以忽略它 是否有一个易于实现的算法或免费的Java库具有此

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

源图像没有被压缩,但我想三角洲被压缩

我需要能够重新创建的图像完全作为输入(所以有损视频编解码器是不合适的。)

我想到的是:

  • 将新图像与旧图像的负片合成
  • 以任何可以使用RLE(可能是PNG)压缩的通用格式保存合成图像
  • 通过将前一个图像与增量合成,重新创建第二个图像
虽然图像有一个alpha通道,但出于此功能的目的,我可以忽略它


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

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

对现有无损压缩程序进行一点试验——PNG、无损JPEG、,等等——仅在包含更改的图像上(您可以使用PNG的透明背景,或一些统一的颜色)。这些算法在压缩一幅基本不变的图像时非常有效,如果你不是专家,你将无法击败它们。

如果矩形的数量通常很小,而矩形本身很小,你可以分辨出有差异的行和列,用它来画出可能不同的矩形

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

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
迭代每个可能的矩形,确定是否有更改,然后对它们进行编码。如果需要,可以添加其他哈希轴,而不是行和列。。。就像您可以将图片细分为多个区域,并对某个区域是否有任何更改进行哈希,然后使用哈希确定是否需要对某个区域进行编码。您可以执行任意次数的操作,并拥有一个相当快速的算法,该算法还可以生成小文件


不管是什么情况,我认为你最好的办法是建立一张改变了什么的地图,并使用聚合来告诉你是否改变了块,以指导你的决策。如果您收集了足够多的算法,您甚至可以创建两种不同的算法,在不同的情况下都能很好地工作,然后将它们放入责任链中,根据您构建的映射和散列的特征决定使用哪种算法。

因此磁盘空间是首要考虑因素,不是构建delta所需的时间吗?@MaxGuernseyIII,是的,但那是因为我假设其他任务将主导CPU负载。我可能错了。是的,这是一种方法。你知道一个计算最小变化矩形集的算法吗?我假设你知道这些变化发生在哪里。如果不是这样的话,这可能不是正确的路径。你可能想看看ImageMagick的比较工具:我猜他们的实现不是最差的,也许看看代码或者在邮件列表上询问一下。