我有一个包含百万级图像的数据集,我想做的是像Counter(<list of images>)一样检查重复项并计算整个数据集的数量。然而,考虑到图像的大小,将所有图像加载到内存中似乎是不可行的。那么,有没有办法做到这一点呢?我是否需要编写自己的散列函数和反向dict?
为sha1编辑
我做了一些像这样的事情
image = Image.open("x.jpg") # PIL library
hashlib.sha1(image)然后得到一个错误,比如
TypeError: object supporting the buffer API required我现在该怎么做?
发布于 2018-08-10 08:49:55
正如所建议的,您可以使用任何散列函数,并使用它将图像文件摘要为二进制文件。然后将摘要保存在字典中,并使用它来计算重复项(如果愿意,也可以存储更多信息)。
在最基本的情况下,对于每个图像,您将执行以下操作:
import hashlib
filename = "x.jpg"
hashstr = hashlib.sha1(open(filename).read()).hexdigest()这将在hashstr中返回十六进制字符串,如5fe54dee8f71c9f13579f44c01aef491e9d6e655
正如所指出的,这仅在文件级别的复制是逐字节的情况下才有效。如果你想剔除相同的图像,比如说在不同的分辨率或不同的维度下,hashlib函数是无能为力的,你需要找到一种不同的方法来确定相等。
https://stackoverflow.com/questions/51772023
复制相似问题