Как узнать, совпадают ли два изображения? [закрыто]

20

У меня более 10000 изображений, из которых около 2000 дубликаты в других форматах (как в JPEG, PNG, GIF). Оба эти числа увеличиваются с каждым днем. Мне нужно удалить эти дубликаты, и для этого я должен знать, как их сначала найти.

Моей первой мыслью было проверить пиксели изображений и найти другие изображения, которые имеют одинаковые цветные пиксели в тех же координатах. Но эта опция не всегда работает. Допустим, я ищу дубликат. Что касается объекта поиска, я выбираю 8-битный файл PNG. Он найдет все дубликаты этого изображения, но только 8-битный PNG, иногда 8-битный GIF и редко JPEG (из-за алгоритмических изображений, я полагаю?).

Моя вторая мысль состояла в том, чтобы продублировать все эти изображения и перекрасить их в строгую двухцветную палитру (скажем, черно-белую) и выполнить такое же сканирование, как указано выше. И снова изображение JPEG не на 100% похоже на формат PNG или GIF (по той же причине, что и выше?).

Третья мысль заключалась в том, чтобы уменьшить процентное отношение к тому, насколько изображение должно быть знакомым, и увеличить степень изменения цвета, что приведет к нежелательному удалению изображения ...

Есть предположения?

Aistis
источник
Форматы со сжатием с потерями приводят к тому, что изображения не на 100% идентичны версиям без потерь. Должна ли у вас быть утилита командной строки или вы можете запустить программу с графическим интерфейсом, которая делает предложения, а затем показывает изображения, которые имеют, скажем,> 90% похожих пикселей (рассчитайте среднее отклонение)? (и, конечно, размер пикселя должен быть одинаковым в любом формате)
thorsten müller
4
stackoverflow.com/questions/2219185/…
Благовест Буюклиев
1
Сколько будет иметь одинаковое имя файла, но с другим расширением?
JeffO
4
Полезный ответ, который не требует недель написания кода: stackoverflow.com/questions/596262/…
mac

Ответы:

17

Перцептивные хеши могут быть ответом:

http://www.phash.org/

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

Джо
источник
9
  1. Проверьте размеры. Если разные => изображения не совпадают.
  2. Проверьте форматы. Если то же самое => Выполнить точное сравнение, пиксель за пикселем.
  3. Если разные форматы делают это:

Не сравнивайте RGB (красный, зеленый, синий). Сравните яркость как половину веса и сравните цвет / оттенок с другой половиной (или 2/3 против 1/3). Рассчитайте разницу в значениях и в зависимости от значения «допуск» они будут одинаковыми или нет.

JPEG сильно сжимает информацию о цвете, но старается не портить значения ограничения.

Борис Янков
источник
6

Когда несколько лет назад я просматривал кучу изображений для дуплейсов, я обнаружил, что сокращение всего до миниатюр 8x8, а затем вычисление показателя сходства на основе квадрата расстояния (обработка трех цветов по отдельности) между миниатюрами работает довольно хорошо. Обратите внимание , что вы можете провести МНОГО 8х8 миниатюр в памяти.

Практически все дупсы были оценены ниже недопечатных. Единственными проблемами были некоторые изображения, которые имели очень низкий контраст и были похожими в целом, хотя фактическое содержание было разным (фон в каждом случае был песочным).

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

Лорен Печтель
источник
1
Обычно YUV лучше, чем RGB, менее чувствителен к незначительным изменениям цветового баланса.
Мартин Беккет
Этот метод миниатюр для предварительного выбора потенциальных совпадений действителен, YUV - приятное прикосновение, и я видел, что по тем же причинам он превратился в карту чистой яркости.
Патрик Хьюз
@Martin Beckett: Сумма квадратов разницы RGB была первой вещью, которую я попробовал, и она работала достаточно хорошо, что я не пытался улучшить ее - и при этом она ловила лжи с редактированием. Со строгим определением дублирования это было достаточно хорошо, чтобы я разрешил автоудаление.
Лорен Печтел
@ Лорен, если бы они были незначительными правками пикселей того же изображения, которое должно работать. Просто jpeg портит RGB больше, чем цветовое пространство YUV. Просто совет ;-)
Мартин Беккет
По своей природе очень темные изображения имеют тенденцию иметь меньшую сумму квадратов различий, даже если они совсем не похожи. Порог может быть отрегулирован с учетом средней яркости изображения. Я использую эту среднюю яркость в качестве предварительного фильтра, чтобы избежать O (n ^ 2) сравнений изображений, так что он уже там.
Габриэль
1

Может быть, вы должны написать код, который сканирует изображения на предмет сходства. Вы можете преобразовать все фотографии в формат ARGB и сравнить их. (в памяти)

Возможный подход может быть следующим: разделить картинки на зоны. Отсканируйте средний цвет и / или яркость зон, чтобы сравнить два изображения по сходству.

Если более чем, скажем, 90% зон совпадают, вы выбрали одну, чтобы перейти к списку кандидатов на удаление. Таким образом, у вас есть список кандидатов. Вы можете использовать соотношение сторон изображений, чтобы классифицировать изображения на горизонтальных и вертикальных изображениях для ускорения сравнений. таким образом, вы можете компенсировать алгоритмы с потерями, которые не воспроизводят правильные цвета попиксельно. Вы запускаете программу в одночасье, а утром делаете это :). В .Net это можно сделать довольно легко с помощью GDI + lib.

О нет
источник