什么算法可用于比较图像文件?

4
请注意,我不是要求创建图像文件的“可视差异”。我想知道是否有适用于图像文件的Unix命令行diff / patch实用程序。
到目前为止,我已经在两个图像文件上尝试了bsdiff和xdelta。一个文件是8000x8000的图片,并使用Gimp的“随机噪声”渲染器。另一个是相同的图片,上面画了一些蓝色线条进行了比较真实的测试。
以下是我的结果:
$ time xdelta3 -e -s 1.png 2.png xdelta.patch

real    0m1.222s
user    0m1.106s
sys     0m0.114s

$ time bsdiff 1.png 2.png bsdiff.patch

real    0m20.860s
user    0m20.694s
sys     0m0.169s

$ ls -l 1.png 2.png xdelta.patch bsdiff.patch 
-rw-r--r-- 1 mardok mardok 6278160 May 20 20:21 1.png
-rw-r--r-- 1 mardok mardok 6669305 May 20 20:32 2.png
-rw-r--r-- 1 mardok mardok 6682740 May 20 21:06 bsdiff.patch
-rw-r--r-- 1 mardok mardok 6678609 May 20 21:05 xdelta.patch

由于补丁比图像本身还要大,因此这两个工具都不适合这项工作。bsdiff尤其不适合,因为它需要20秒的时间。

那么,有没有其他类型的算法可以用于图像差异比较呢?

编辑:我刚刚进行了另一次测试,但这次将图像保存在Gimp的本地.xcf格式中。结果更好了。

$ ls -l 1.xcf 2.xcf xcf.bsdiff xcf.xdelta 
-rw-r--r-- 1 mardok mardok 54693130 May 20 21:38 1.xcf
-rw-r--r-- 1 mardok mardok 53575879 May 20 21:38 2.xcf
-rw-r--r-- 1 mardok mardok  2758826 May 20 21:39 xcf.bsdiff
-rw-r--r-- 1 mardok mardok  3912197 May 20 21:41 xcf.xdelta

XCF文件比PNG文件大五倍,但差异要小得多。因此,似乎对PNG文件进行差异比较是很麻烦的。不过,我真的很想知道是否有一种实用程序可以处理PNG、JPG、TIFF或其他主流图像文件格式。

编辑2:现在加入了JPEG文件:

$ ls -l 1.jpg 2.jpg jpg.bsdiff jpg.xdelta 
-rw-r--r-- 1 mardok mardok 2134569 May 20 21:49 1.jpg
-rw-r--r-- 1 mardok mardok 4509765 May 20 21:49 2.jpg
-rw-r--r-- 1 mardok mardok 3417896 May 20 21:50 jpg.bsdiff
-rw-r--r-- 1 mardok mardok 3917899 May 20 21:50 jpg.xdelta

我没有发布时间,但是bsdiff在JPEG文件上创建差异所花费的时间非常短。这是第一个差异,在其中一个图像产生了比原始文件更小的结果。然而,它仍然不够好,因为补丁需要明显地比两个文件都小。

更正:bsdiff花费的时间异常短是因为JPEG文件很小。糟糕。

编辑3:为了完整起见,这里是TIFF文件的结果:

$ ls -l 1.tiff 2.tiff tiff.xdelta tiff.bsdiff 
-rw-r--r-- 1 mardok mardok 10182924 May 20 21:56 1.tiff
-rw-r--r-- 1 mardok mardok 11069486 May 20 21:56 2.tiff
-rw-r--r-- 1 mardok mardok 11077784 May 20 21:57 tiff.bsdiff
-rw-r--r-- 1 mardok mardok 11054104 May 20 21:56 tiff.xdelta

他们的测试结果与PNG测试相同。它们不适合这项工作。

总体而言,您应该不要在图像文件上使用典型的二进制差异比较。而应该使用哪种算法呢?


我不知道有没有这样的方法...但我很高兴你没有试图在儿童漫画页面上作弊,找“找不同”类型的游戏 :) - Mr Moose
我对图像并不了解。所以这可能有些不太准确。但是MPEG3/4的东西呢?它们不是从一个图像开始,然后不断地进行差异化处理来制作电影吗? - Greg
我已经重新修改了问题,问应该使用什么算法。这样更适合在 SO 上吗? - user489481
1个回答

3
任何通用的二进制差异工具都会在压缩数据方面存在问题。原因是,就字节级别而言,即使输入数据变化很小,压缩数据也可能发生显著变化。
当你对随机噪声图像画几条线时,PNG 文件中使用的压缩将产生完全不同的输出文件。这基本上是无法避免的。
为了对图像文件进行有效的增量处理,您需要使用一个工具来解压缩两个图像,逐像素比较它们,并创建差异列表。补丁程序将读取源图像和差异列表,并创建一个新的结果图像。
在上述方法中,您可能会遇到一个问题,即由于图像压缩是非确定性的,因此在结果图像中,您可能得不到与第二个原始图像相同的压缩字节。如果一切顺利,您应该得到相同的未压缩图像,但如果您尝试验证文件的数字签名,则这并没有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接