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

Diff 什么算法可以用来区分图像文件?,diff,Diff,请注意,我并不是要求创建图像文件的“视觉差异”。我在问是否有一个Unix命令行diff/patch实用程序可以很好地用于图像文件 到目前为止,我已经在两个图像文件上试用了bsdiff和xdelta。一个文件是8000x8000图片,使用Gimp的“随机噪声”渲染器。另一张是同一张图片,上面画了一些蓝线,以进行一些真实的测试 以下是我的结果: $ time xdelta3 -e -s 1.png 2.png xdelta.patch real 0m1.222s user 0m1.10

请注意,我并不是要求创建图像文件的“视觉差异”。我在问是否有一个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文件大五倍,但是diff文件要小得多。所以,看起来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文件上创建了一个diff。这是第一次尝试为其中一幅图像生成更小的结果。但是,它仍然不够好,因为补丁需要明显小于这两个文件

更正:bsdiff花费了异常短的时间,因为JPEG很小。哎呀

EDIT3:为了彻底了解ness,以下是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测试相同的结果。他们不太适合这份工作


总之,典型的二进制差异不应用于图像文件。应该使用什么算法来代替?

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

当您拍摄随机噪声图像并在其上绘制几行时,PNG文件中使用的压缩将生成完全不同的输出文件。这几乎是不可能的

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


使用上述方法可能会遇到的一个问题是,由于图像压缩是不确定的,因此在生成的图像中可能无法获得与原始第二个图像相同的压缩字节。如果一切顺利,你应该得到相同的未压缩图像,但如果你试图验证文件的数字签名,那就没有什么帮助。

据我所知,这不是……但我很高兴你没有试图在儿童漫画页面中的“发现差异”类游戏中作弊:)我对图像了解不多。所以这可能太离谱了。但是mpeg3/4的东西呢?他们不是从一个图像开始,然后不断地“区分”它来制作一部电影吗?我重新编写了这个问题,问应该使用什么算法来代替。这套衣服适合你吗?