Я имею по 10K файлам для продуктов, проблема, то, что многие изображения являются дубликатами.
Если нет никакого изображения, существует стандартное изображение, в котором не говорится 'изображение'.
Как я могу обнаружить, если изображение является этим стандартом 'никакое изображение' файл изображения?
Обновление изображение является другим именем, но это - точно то же изображение иначе.
Люди говорят, что Хеш, таким образом, я сделал бы это?
im = cStringIO.StringIO(file.read())
img = im.open(im)
md5.md5(img)
Я написал сценарий для этого некоторое время назад. Сначала он сканирует все файлы, отмечая их размеры в словаре. В итоге вы получите:
images[some_size] = ['x/a.jpg', 'b/f.jpg', 'n/q.jpg']
images[some_other_size] = ['q/b.jpg']
Затем для каждого ключа (размера изображения), где в словаре более 1 элемента, я бы прочитал некоторый фиксированный объем файла и сделал хеш. Что-то вроде:
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)
Это все не в моей голове, я не тестировал код, но идею вы поняли.
Если вы ищете точные копии определенного изображения: загрузите это изображение в память, а затем переберите свою коллекцию изображений; пропустить любой файл другого размера; сравнить содержимое файлов одинакового размера, останавливаясь на первом различии.
Вычисление хэша в этой ситуации на самом деле контрпродуктивно, потому что вам придется полностью считывать каждый файл в память (вместо того, чтобы останавливаться на первом различии) и выполнять с ним задачу, требующую интенсивного использования ЦП.
С другой стороны, если существует несколько наборов дубликатов, лучше вычислять хэш каждого файла.
Если вы также ищете визуальные почти дубликаты, вам может помочь findimagedupes .
Хешируйте их. Столкновения - это дубликаты (по крайней мере, математически невозможно, чтобы это не один и тот же файл).
Предполагая, что вы говорите об одних и тех же изображениях с точки зрения одних и тех же данных изображения.
Вычислить хэш изображения «без изображения» и сравнить его с хэшами других изображений. Если хеши одинаковые, это один и тот же файл.
Как Кстати, для изображений я считаю, что хэши растровых данных намного более эффективны, чем хэши файлов.
ImageMagick предоставляет надежный способ вычисления таких хэшей, и для python доступны различные привязки. Это помогает обнаруживать одни и те же изображения с разным сжатием без потерь и разными метаданными.
Пример использования:
>>> import PythonMagick
>>> img = PythonMagick.Image("image.png")
>>> img.signature()
'e11cfe58244d7cf98a79bfdc012857a9391249dca3aedfc0fde4528eed7f7ba7'