Эффективный способ снятия отпечатков пальцев с изображения (jpg, png и т. Д.)? - PullRequest
20 голосов
/ 11 августа 2009

Есть ли эффективный способ получения отпечатка пальца изображения для обнаружения дубликатов?

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

[Обновить] Что касается метаданных в файлах jpg, кто-нибудь знает, хранятся ли они в определенной части файла? Я ищу простой способ игнорировать это - например. можно пропустить первые x байтов файла или взять x байтов из конца файла, чтобы убедиться, что я не получаю метаданные?

Ответы [ 9 ]

21 голосов
/ 11 августа 2009

Ударьте в темноте, если вы хотите обойти метаданные и размер, связанные с вещами:

  1. Обнаружение краев и независимое от масштаба сравнение
  2. Выборка и статистический анализ значений градаций серого / RGB (средняя яркость, усредненная карта цветов)
  3. БПФ и другие преобразования (Хорошая статья Классификация отпечатков пальцев с использованием БПФ )

и множество других.

В основном:

  1. Преобразование JPG / PNG / GIF в байтовый массив RGB, который не зависит от кодировки
  2. Используйте метод классификации нечетких шаблонов, чтобы сгенерировать «хэш шаблона» в изображении ... не хэш массива RGB, как некоторые предполагают
  3. Затем вам нужен распределенный метод быстрого сравнения хешей, основанный на пороговом значении совпадения для инкапсулированного хеша или кодирования шаблона. Эрланг был бы хорош для этого:)

Преимущества:

  1. Будет, если вы используете AI / Training, обнаруживать дубликаты вне зависимости от кодировки, размера, аспекта, изменения оттенка и яркости, различий динамического диапазона / подвыборки и в некоторых случаях перспективы

Недостатки:

  1. Может быть трудно кодировать .. что-то вроде OpenCV может помочь
  2. Вероятностные ... ложные срабатывания вероятны, но их можно уменьшить с помощью нейронных сетей и других ИИ
  3. Медленно, если вы не можете инкапсулировать качества шаблонов и распределить поиск (стиль MapReduce)

Оформить заказ книги анализа изображений, такие как:

  1. Классификация шаблонов 2ed
  2. Основы обработки изображений
  3. Обработка изображений - Принципы и применение

и другие

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

4 голосов
/ 11 августа 2009

Использование байтового размера изображения для сравнения подойдет для многих приложений. Другой способ будет:

  1. Удалите метаданные.
  2. Рассчитайте MD5 (или другой подходящий алгоритм хеширования) для изображение.
  3. Сравните это с MD5 (или чем-то еще) потенциального обманщика изображение (при условии, что вы удалили метаданные для этого тоже)
3 голосов
/ 26 декабря 2011

Вы можете использовать такой алгоритм, как SIFT (масштабное инвариантное преобразование объектов), чтобы определить ключевые точки на рисунках и сопоставить их.

См. http://en.wikipedia.org/wiki/Scale-invariant_feature_transform

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

3 голосов
/ 11 августа 2009

Проверьте этот документ на Надежное хеширование изображений .

1 голос
/ 11 августа 2009

Вы хотите выполнить хэш изображения. Поскольку вы не указали конкретный язык, я думаю, у вас нет предпочтений. По крайней мере, есть набор инструментов Matlab (бета), который может это сделать: http://users.ece.utexas.edu/~bevans/projects/hashing/toolbox/index.html. Большинство результатов Google по этому вопросу - результаты исследований, а не фактические библиотеки или инструменты.

Проблема с MD5ing заключается в том, что MD5 очень чувствителен к небольшим изменениям на входе, и звучит так, будто вы хотите сделать что-то немного «умнее».

0 голосов
/ 11 августа 2009

Это всего лишь идея: возможно, низкочастотные компоненты, присутствующие в DCT jpeg, могут быть использованы в качестве идентификатора инварианта размера.

0 голосов
/ 11 августа 2009

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

Но это не работает, когда само изображение обрабатывается в любом случае, включая масштабирование, вращение.

Чтобы сделать именно то, что вы хотите, вы должны использовать Image Watermarking, но он запатентован и может быть дорогим.

0 голосов
/ 11 августа 2009

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

0 голосов
/ 11 августа 2009

Довольно интересный вопрос. Самый быстрый и легкий способ - вычислить crc32 байтового массива контента, но это будет работать только на 100% идентичных изображениях. Для более разумного сравнения вам, вероятно, понадобится анализ нечеткой логики ...

...