可以使用什么算法来区分图像文件?

时间:2014-05-21 01:30:14

标签: diff

请注意,我并没有要求创建一个"视觉差异"图像文件。我问是否有适用于图像文件的Unix命令行差异/补丁实用程序。

到目前为止,我已经在两个图像文件上尝试了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或其他主流图像文件格式的实用程序。

EDIT2: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很小。糟糕。

EDIT3:为了完整起见,这里是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测试相同的结果。他们并不适合这份工作。

总而言之,不应在图像文件上使用典型的二进制差异。应该使用什么算法?

1 个答案:

答案 0 :(得分:3)

任何常规二进制差异工具都会遇到压缩数据问题。原因是在字节级别,即使输入数据发生微小变化,压缩数据也会发生显着变化。

当你拍摄随机噪声图像并在其上画几行时,PNG文件中使用的压缩将产生完全不同的输出文件。几乎没有办法解决这个问题。

为了对图像文件进行有效的增量,您需要使用一个工具来解压缩两个图像,逐个像素地比较它们,并创建差异列表。补丁程序将读取源图像和差异列表,并创建新的结果图像。

使用上述方法可能遇到的一个问题是,由于图像压缩是非确定性的,因此您可能无法在结果图像中获得与原始第二图像相同的压缩字节。如果一切顺利,您应该获得相同的未压缩图像,但是,如果您尝试验证文件的数字签名,则无法提供帮助。