我有超过10K的产品文件,问题是很多图片都是重复的。
如果没有图像,则会有标准图像显示“无图像”。
如何检测图像是否为此标准“无图像”图像文件?
更新的 图像是一个不同的名称,但它与图像完全相同。
人们在说哈希,我会这样做吗?
im = cStringIO.StringIO(file.read())
img = im.open(im)
md5.md5(img)
答案 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)
哈希他们。碰撞是重复的(至少,数学上不可能它们不是同一个文件)。