Можно ли обнаружить дубликаты файлов изображений? - PullRequest
7 голосов
/ 02 августа 2010

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

Если изображение отсутствует, существует стандартное изображение с надписью «нет изображения».

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

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

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

im = cStringIO.StringIO(file.read())
img = im.open(im)
md5.md5(img)

Ответы [ 6 ]

8 голосов
/ 02 августа 2010

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

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

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

>>> import PythonMagick
>>> img = PythonMagick.Image("image.png")
>>> img.signature()
'e11cfe58244d7cf98a79bfdc012857a9391249dca3aedfc0fde4528eed7f7ba7'
5 голосов
/ 02 августа 2010

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

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)

Это все из головы, не проверял код, но вы поняли.

5 голосов
/ 02 августа 2010

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

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

2 голосов
/ 02 августа 2010

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

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

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

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

1 голос
/ 10 сентября 2018

У меня были проблемы с установкой PythonMagick на Fedora, но Wand (еще одна привязка ImageMagick) работала.

from wand.image import Image

img = Image(filename="image.jpg")
print(img.signature)

Только сначала обязательно установите все:

yum install python3-wand ImageMagick
0 голосов
/ 02 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...