Эффективный способ отпечатки изображения (jpg, png и т.д.)?
Есть ли эффективный способ получить отпечаток изображения для повторного обнаружения?
То есть, учитывая файл изображения, скажем, jpg или png, я бы хотел быстро вычислить значение, которое идентифицирует контент изображения и достаточно устойчиво к другим аспектам изображения (например, метаданные изображения). Если он имеет дело с изменением размера, это еще лучше.
[Обновить] Что касается метаданных в jpg файлах, знает ли кто-нибудь, хранятся ли они в определенной части файла? Я ищу простой способ игнорировать его - например. могу ли я пропустить первые x байтов файла или взять x байтов из конца файла, чтобы гарантировать, что я не получаю метаданные?
Ответы
Ответ 1
Удар в темноте, если вы хотите обойти метаданные и связанные с размером вещи:
И многие другие.
В принципе:
- Преобразование JPG/PNG/GIF в массив байтов RGB, который не зависит от кодировки
- Используйте метод классификации нечетких шаблонов для генерации "хэша шаблона" на изображении... не хэш массива RGB, поскольку некоторые предлагают
- Затем вам нужен распределенный метод быстрого хеш-сравнения на основе соответствующего порогового значения для инкапсулированного хэша или кодирования шаблона. Эрланг был бы хорош для этого:)
Преимущества:
- Если вы используете какие-либо AI/Training, дубликаты точек, независимо от модификации кодировки, размера, аспектности, оттенка и лумы, различий динамического диапазона/подвыборки и в некоторых случаях перспективы
Недостатки:
- Может быть сложно закодировать.. что-то вроде OpenCV может помочь
- Вероятностные... ложные срабатывания вероятны, но могут быть уменьшены с помощью нейронных сетей и других AI
- Медленно, если вы не можете инкапсулировать свойства паттерна и распределить поиск (стиль MapReduce)
Ознакомьтесь с книгами анализа изображений, например:
- Классификация шаблонов 2ed
- Основы обработки изображений
- Обработка изображений - принципы и приложения
И другие
Если вы масштабируете изображение, тогда все проще. Если нет, то вы должны бороться с тем, что масштабирование является убыточным по сравнению с уменьшением выборки.
Ответ 2
Использование размера байта изображения для сравнения было бы подходящим для многих приложений. Другой способ:
- Удалите метаданные.
- Рассчитать MD5 (или другой подходящий алгоритм хеширования) для
изображение.
- Сравните это с MD5 (или любым другим) потенциального дублирования
изображение (при условии, что вы удалили
метаданные для этого тоже)
Ответ 3
Посмотрите эту статью на Надежное хеширование изображений.
Ответ 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, могут использоваться как идентификатор инварианта размера.