Действительно ли возможно обнаружить файлы дублирующегося изображения?

Я имею по 10K файлам для продуктов, проблема, то, что многие изображения являются дубликатами.

Если нет никакого изображения, существует стандартное изображение, в котором не говорится 'изображение'.

Как я могу обнаружить, если изображение является этим стандартом 'никакое изображение' файл изображения?

Обновление изображение является другим именем, но это - точно то же изображение иначе.

Люди говорят, что Хеш, таким образом, я сделал бы это?

im = cStringIO.StringIO(file.read())
img = im.open(im)
md5.md5(img)
8
задан Blankman 2 August 2010 в 00:06
поделиться

5 ответов

Я написал сценарий для этого некоторое время назад. Сначала он сканирует все файлы, отмечая их размеры в словаре. В итоге вы получите:

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)

Это все не в моей голове, я не тестировал код, но идею вы поняли.

5
ответ дан 5 December 2019 в 07:33
поделиться

Если вы ищете точные копии определенного изображения: загрузите это изображение в память, а затем переберите свою коллекцию изображений; пропустить любой файл другого размера; сравнить содержимое файлов одинакового размера, останавливаясь на первом различии.

Вычисление хэша в этой ситуации на самом деле контрпродуктивно, потому что вам придется полностью считывать каждый файл в память (вместо того, чтобы останавливаться на первом различии) и выполнять с ним задачу, требующую интенсивного использования ЦП.

С другой стороны, если существует несколько наборов дубликатов, лучше вычислять хэш каждого файла.

Если вы также ищете визуальные почти дубликаты, вам может помочь findimagedupes .

2
ответ дан 5 December 2019 в 07:33
поделиться

Хешируйте их. Столкновения - это дубликаты (по крайней мере, математически невозможно, чтобы это не один и тот же файл).

0
ответ дан 5 December 2019 в 07:33
поделиться

Предполагая, что вы говорите об одних и тех же изображениях с точки зрения одних и тех же данных изображения.

Вычислить хэш изображения «без изображения» и сравнить его с хэшами других изображений. Если хеши одинаковые, это один и тот же файл.

5
ответ дан 5 December 2019 в 07:33
поделиться

Как Кстати, для изображений я считаю, что хэши растровых данных намного более эффективны, чем хэши файлов.

ImageMagick предоставляет надежный способ вычисления таких хэшей, и для python доступны различные привязки. Это помогает обнаруживать одни и те же изображения с разным сжатием без потерь и разными метаданными.

Пример использования:

>>> import PythonMagick
>>> img = PythonMagick.Image("image.png")
>>> img.signature()
'e11cfe58244d7cf98a79bfdc012857a9391249dca3aedfc0fde4528eed7f7ba7'
9
ответ дан 5 December 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: