我有一个包含百万个级别的图像的数据集,我想做的事情是像Counter(<list of images>)
这样检查重复项并为整个数据集计数。但是,考虑到图像的大小,将所有内容加载到内存中似乎是不可行的。因此,有没有办法做这样的事情?我需要编写自己的哈希函数并反转字典吗?
为sha1
编辑:
我做了类似
image = Image.open("x.jpg") # PIL library
hashlib.sha1(image)
并出现类似
的错误TypeError: object supporting the buffer API required
我现在该怎么办?
答案 0 :(得分:1)
根据建议,您可以使用任何哈希函数,并使用它来将图像文件摘要为二进制文件。然后将摘要保存在字典中,并用它来计算重复项(或根据需要存储更多信息)。
从最基本的角度来说,对于每张图片,您都会执行以下操作:
import hashlib
filename = "x.jpg"
hashstr = hashlib.sha1(open(filename).read()).hexdigest()
这将在hashstr
中返回一个十六进制字符串,例如5fe54dee8f71c9f13579f44c01aef491e9d6e655
如前所述,这仅在复制是在文件级别(逐字节)的情况下才有效。如果要去除相同的图像(例如,使用不同的分辨率或不同的尺寸),hashlib
函数将无济于事,您需要寻找不同的方法来确定平等。