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

13 投票
6 回答
16908 浏览
提问于 2025-04-16 02:09

我有超过一万个产品文件,但问题是很多图片是重复的。

如果没有图片,就会有一张标准的图片,上面写着“没有图片”。

我该怎么判断这张图片是不是这个标准的“没有图片”的文件呢?

更新:这张图片的名字不同,但其他方面完全一样。

有人提到用哈希值,那我该怎么做呢?

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

6 个回答

5

假设你说的是相同的图片,也就是说它们的数据是一样的。

计算一下“没有图片”的那张图片的哈希值,然后把这个哈希值和其他图片的哈希值进行比较。如果哈希值相同,那就说明它们是同一个文件。

15

顺便提一下,对于图片来说,我发现用栅格数据哈希比文件哈希要有效得多。

ImageMagick 提供了一种可靠的方法来计算这些哈希值,并且有不同的 Python 绑定可供使用。这可以帮助我们识别出那些经过不同无损压缩和不同元数据处理的相同图片。

使用示例:

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

我之前写了一个脚本来处理这个问题。首先,它会扫描所有文件,并把它们的大小记录在一个字典里。最后你会得到:

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)

这些都是我随便想的,代码还没测试过,但你明白我的意思了。

撰写回答