У меня более 10000 изображений, из которых около 2000 дубликаты в других форматах (как в JPEG, PNG, GIF). Оба эти числа увеличиваются с каждым днем. Мне нужно удалить эти дубликаты, и для этого я должен знать, как их сначала найти.
Моей первой мыслью было проверить пиксели изображений и найти другие изображения, которые имеют одинаковые цветные пиксели в тех же координатах. Но эта опция не всегда работает. Допустим, я ищу дубликат. Что касается объекта поиска, я выбираю 8-битный файл PNG. Он найдет все дубликаты этого изображения, но только 8-битный PNG, иногда 8-битный GIF и редко JPEG (из-за алгоритмических изображений, я полагаю?).
Моя вторая мысль состояла в том, чтобы продублировать все эти изображения и перекрасить их в строгую двухцветную палитру (скажем, черно-белую) и выполнить такое же сканирование, как указано выше. И снова изображение JPEG не на 100% похоже на формат PNG или GIF (по той же причине, что и выше?).
Третья мысль заключалась в том, чтобы уменьшить процентное отношение к тому, насколько изображение должно быть знакомым, и увеличить степень изменения цвета, что приведет к нежелательному удалению изображения ...
Есть предположения?
Ответы:
Перцептивные хеши могут быть ответом:
http://www.phash.org/
источник
Не сравнивайте RGB (красный, зеленый, синий). Сравните яркость как половину веса и сравните цвет / оттенок с другой половиной (или 2/3 против 1/3). Рассчитайте разницу в значениях и в зависимости от значения «допуск» они будут одинаковыми или нет.
JPEG сильно сжимает информацию о цвете, но старается не портить значения ограничения.
источник
Когда несколько лет назад я просматривал кучу изображений для дуплейсов, я обнаружил, что сокращение всего до миниатюр 8x8, а затем вычисление показателя сходства на основе квадрата расстояния (обработка трех цветов по отдельности) между миниатюрами работает довольно хорошо. Обратите внимание , что вы можете провести МНОГО 8х8 миниатюр в памяти.
Практически все дупсы были оценены ниже недопечатных. Единственными проблемами были некоторые изображения, которые имели очень низкий контраст и были похожими в целом, хотя фактическое содержание было разным (фон в каждом случае был песочным).
Это также было эффективно при обнаружении изображений, которые были обмануты, за исключением того, что кто-то уменьшил разрешение или качество на одном, чтобы уменьшить размер файла.
источник
Может быть, вы должны написать код, который сканирует изображения на предмет сходства. Вы можете преобразовать все фотографии в формат ARGB и сравнить их. (в памяти)
Возможный подход может быть следующим: разделить картинки на зоны. Отсканируйте средний цвет и / или яркость зон, чтобы сравнить два изображения по сходству.
Если более чем, скажем, 90% зон совпадают, вы выбрали одну, чтобы перейти к списку кандидатов на удаление. Таким образом, у вас есть список кандидатов. Вы можете использовать соотношение сторон изображений, чтобы классифицировать изображения на горизонтальных и вертикальных изображениях для ускорения сравнений. таким образом, вы можете компенсировать алгоритмы с потерями, которые не воспроизводят правильные цвета попиксельно. Вы запускаете программу в одночасье, а утром делаете это :). В .Net это можно сделать довольно легко с помощью GDI + lib.
источник