是否可以检测到重复的图像文件?

时间:2010-08-01 21:54:11

标签: python image

我有超过10K的产品文件,问题是很多图片都是重复的。

如果没有图像,则会有标准图像显示“无图像”。

如何检测图像是否为此标准“无图像”图像文件?

更新的 图像是一个不同的名称,但它与图像完全相同。

人们在说哈希,我会这样做吗?

im = cStringIO.StringIO(file.read())
img = im.open(im)
md5.md5(img)

6 个答案:

答案 0 :(得分:7)

作为旁注,对于图像,我发现栅格数据哈希比文件哈希更有效。

ImageMagick提供了计算此类哈希的可靠方法,并且可用的python有不同的绑定。它有助于检测具有不同无损压缩和不同元数据的相同图像。

用法示例:

>>> import PythonMagick
>>> img = PythonMagick.Image("image.png")
>>> img.signature()
'e11cfe58244d7cf98a79bfdc012857a9391249dca3aedfc0fde4528eed7f7ba7'

答案 1 :(得分:5)

假设您正在谈论相同图像数据的相同图像。

计算“无图像”图像的hash并将其与其他图像的哈希值进行比较。如果哈希值相同,则它是同一个文件。

答案 2 :(得分:4)

我为此写了一段脚本。首先,它扫描所有文件,在字典中记录它们的大小。你最终得到:

images[some_size] = ['x/a.jpg', 'b/f.jpg', 'n/q.jpg']
images[some_other_size] = ['q/b.jpg']

然后,对于字典中有多个元素的每个键(图像大小),我会读取一些固定数量的文件并执行哈希。类似的东西:

possible_dupes = [size for size in images if len(images[size]) > 1]
for size in possible_dupes:
    hashes = defaultdict(list)
    for fname in images[size]:
        m = md5.new()
        hashes[ m.update( file(fname,'rb').read(10000) ).digest() ] = fname
    for k in hashes:
       if len(hashes[k]) <= 1: continue
       for fname in hashes[k][1:]:
           os.remove(fname)

这一切都是我的头脑,没有测试过代码,但你明白了。

答案 3 :(得分:2)

如果您正在寻找特定图像的精确副本:将此图像加载到内存中,然后遍历图像集;跳过任何大小不同的文件;比较具有相同大小的文件的内容,停在第一个区别。

在这种情况下计算哈希实际上是适得其反的,因为你必须将每个文件完全读入内存(而不是能够在第一个区别停止)并在其上执行CPU密集型任务。

如果有多组重复项,另一方面,计算每个文件的哈希值会更好。

如果您还在寻找视觉上的近似重复项,findimagedupes可以为您提供帮助。

答案 4 :(得分:1)

我在Fedora上安装PythonMagick遇到麻烦,但是Wand(另一个ImageMagick绑定)起作用了。

from wand.image import Image

img = Image(filename="image.jpg")
print(img.signature)

只需确保首先安装所有内容:

yum install python3-wand ImageMagick

答案 5 :(得分:0)

哈希他们。碰撞是重复的(至少,数学上不可能它们不是同一个文件)。