Новостной портал компании имеет два сервера (OS = Centos 6):
Первый сервер №1 имеет около 1 миллиона изображений (.jpg, .png), а сервер №2 имеет почти такое же количество - 1 миллион изображений. Некоторые из них являются идентичными дубликатами, некоторые являются дубликатами с измененным размером, некоторые с размытием, некоторые без размытия, некоторые являются полностью уникальными изображениями. Имена файлов в основном тоже разные.
Задача - объединить медиа каталог двух серверов в один. После слияния дубликаты должны быть ромовированы (чтобы освободить место на диске).
Я провел несколько тестов с Imagemagick compare -metric RMSE
, но я подумал, что это займет много времени, чтобы сравнить каждый файл с каждым файлом с двух серверов. Таким образом, будет 1 млн x 1 млн = 1 триллион операций, это займет много времени ...
Есть предложения здесь?
Проблема с MD5 в том, что первый сервер делал оригинальные фотографии (загруженные журналистами) и уменьшал их размер до разрешения 1600x900 пикселей с разной степенью сжатия. Тем временем второй сервер делал оригинальные фотографии и ничего с ними не делал, просто записывал на диск. Так что md5 будет разным для всех файлов. :(
Используйте GNU Parallel, чтобы рассчитать только один раз для каждого изображения:
контрольная сумма только данных
перцептивный хэш
Затем отбросьте все с идентичными контрольными суммами и просмотрите те, которые имеют похожие хеш-значения восприятия.
Получите контрольную сумму по только данные изображения (то есть не включая никаких метаданных, таких как другая дата в ваших изображениях), используя ImageMagick следующим образом:
identify -format "%#" a.jpg
9e51c9cf53fddc7d318341cd7e6c6e34663e5c49f20ede16e29e460dfc63867
Ссылки на создание перцептивного хэша:
Привет, Марк, спасибо! На самом деле я уже проверял вашу первую упомянутую ссылку - stackoverflow.com/questions/25198558/…. Отметьте там второй комментарий - он мой, и этот скрипт выдает мне ошибки.
Если скрипт выдает ошибки, попробуйте запустить его вот так, чтобы увидеть, что происходит ... bash -xv ./script
Выход: codehare.io/21p9JB. Насколько я понимаю, -gt
не работает. Поэтому я заменил его на простой знак >
, и, похоже, он работает без ошибок. Но все равно хеш = 0000000000000000
все время для разных образов. Отлаживаю .. И дам знать.
@ fmw42 OP имеет в виду мой код здесь stackoverflow.com/a/25204466/2836621
Вы запускаете код с bash
? Вы установили ImageMagick? Какую версию чата вы используете? Если вы используете v7, вам нужно будет изменить все экземпляры convert
на magick
, поскольку имя программы изменилось. Точно так же все экземпляры identify
необходимо изменить на magick identify
в версии 7 - если вы это используете. Вы не в винде?
@MarkSetchell да, Version: ImageMagick 7.0.7-28
, я заменил все convert
на magick
, также я не нашел в вашем коде никаких экземпляров identify
. И результат следующий: $ ./byb.sh 1/bird1.jpg 0
. :( Я на Centos 6
Пожалуйста, запустите сценарий с помощью bash -xv theScript someImage.jpg
Я только что добавил скрипт (bash unix ImageMagick) для вычисления 4 различных перцептивных хэшей, которые создают хэши двоичных строк, которые могут быть сохранены в метаданных изображения. Также скрипт для вычисления расстояния Хэмминга между двумя хешами двоичных строк. Он может получить доступ к хешам из метаданных изображения. Мои скрипты находятся по адресу fmwconcepts.com/imagemagick/index.php
Не могли бы вы сравнить контрольные суммы MD5 друг с другом? Я чувствую, что это может быть быстрее, чем imagemagick, но вы все равно выполняете 1 триллион операций