Подтвердить что ты не робот

Эффективный способ отпечатки изображения (jpg, png и т.д.)?

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

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

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

4b9b3361

Ответ 1

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

И многие другие.

В принципе:

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

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

  • Если вы используете какие-либо AI/Training, дубликаты точек, независимо от модификации кодировки, размера, аспектности, оттенка и лумы, различий динамического диапазона/подвыборки и в некоторых случаях перспективы

Недостатки:

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

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

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

И другие

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

Ответ 2

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

  • Удалите метаданные.
  • Рассчитать MD5 (или другой подходящий алгоритм хеширования) для изображение.
  • Сравните это с MD5 (или любым другим) потенциального дублирования изображение (при условии, что вы удалили метаданные для этого тоже)

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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