Отпечаток изображения для сравнения сходства многих изображений


94

Мне нужно создать отпечатки многих изображений (около 100000 существующих, 1000 новых в день, RGB, JPEG, максимальный размер 800x800), чтобы очень быстро сравнить каждое изображение с каждым другим изображением. Я не могу использовать методы двоичного сравнения, потому что также должны распознаваться почти похожие изображения.

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


1
На каком языке должна быть библиотека?
Ben S

Ответы:


57

Обычные алгоритмы хеширования или вычисления CRC плохо работают с данными изображения. Необходимо учитывать размерный характер информации.

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

Возможны несколько простых решений:

  1. Создайте гистограмму яркости изображения в виде отпечатка пальца
  2. Создавайте уменьшенные версии каждого изображения в виде отпечатка пальца
  3. Объедините методики (1) и (2) в гибридный подход для повышения качества сравнения.

Гистограмма яркости (особенно та, которая разделена на компоненты RGB) представляет собой разумный отпечаток пальца для изображения - и может быть реализована довольно эффективно. Вычитание одной гистограммы из другой даст новую историограмму, которую вы можете обработать, чтобы определить, насколько похожи два изображения. Гистограммы, поскольку только они оценивают распределение и появление информации о яркости / цвете, достаточно хорошо обрабатывают аффинные преобразования. Если квантовать информацию о яркости каждого цветового компонента до 8-битного значения, 768 байтов памяти будет достаточно для отпечатка пальца изображения практически любого разумного размера. Гистограммы яркости дают ложные негативы при изменении информации о цвете в изображении. Если вы примените преобразования, такие как контраст / яркость, постеризация, смещение цвета, информация о яркости изменится.

Использование масштабированных изображений - это еще один способ снизить информационную плотность изображения до уровня, который легче сравнивать. При уменьшении менее 10% от исходного размера изображения обычно теряется слишком много информации, чтобы его можно было использовать - поэтому изображение размером 800x800 пикселей можно уменьшить до 80x80 и при этом предоставить достаточно информации для выполнения достойного снятия отпечатков пальцев. В отличие от данных гистограммы, вы должны выполнить анизотропное масштабирование данных изображения, когда исходные разрешения имеют разные соотношения сторон. Другими словами, уменьшение изображения 300x800 до миниатюры 80x80 вызывает деформацию изображения, так что по сравнению с изображением 300x500 (что очень похоже) будет вызывать ложноотрицательные результаты. Отпечатки миниатюр также часто дают ложноотрицательные результаты, когда задействованы аффинные преобразования. Если вы перевернете или поверните изображение,

Комбинирование обоих методов - разумный способ застраховать свои ставки и уменьшить количество ложноположительных и ложноотрицательных результатов.


По поводу CRC согласен. Однако, если кто-то хочет его использовать, лучше использовать хэш MD5, чем CRC32
mloskot

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

34

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

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

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


20

Вам обязательно стоит взглянуть на phash .

Для сравнения изображений есть этот проект php : https://github.com/kennethrapp/phasher

И мой маленький клон javascript : https://redaktor.me/phasher/demo_js/index.html

К сожалению, он основан на "битовом подсчете", но распознает повернутые изображения. Другой подход в javascript заключался в построении гистограммы яркости изображения с помощью холста. Вы можете визуализировать гистограмму многоугольника на холсте и сравнить этот многоугольник в своей базе данных (например, пространственный mySQL ...)


это на npm? Я ищу способ сравнить сходство между двумя изображениями с помощью javascript
chovy

Хм, я думал, что это "слишком дешево для npm". На самом деле это была просто демка, быстро написанная с нуля. Однако не стесняйтесь делать с источником все, что хотите. Если у меня получится, я посмотрю позже и отправлю на github
изучу выложу

@SebastianLasse Я только что проверил ваш JS-порт, и это потрясающе! Я просто хочу, чтобы вы могли передать URI изображения Compare()функции вместо того, чтобы сначала загружать изображение. Кроме того, по результатам моего тестирования порог для «очень похожего изображения» должен быть> 90%, а не> 98%.
thdoan

12

Давным-давно я работал над системой с некоторыми похожими характеристиками, и это приближение алгоритма, которому мы следовали:

  1. Разделите картинку на зоны. В нашем случае мы имели дело с видео с разрешением 4: 3, поэтому мы использовали 12 зон. Это снижает разрешение исходных изображений из изображения.
  2. Для каждой зоны рассчитайте общий цвет - среднее значение всех пикселей в зоне.
  3. Для всего изображения рассчитайте общий цвет - среднее значение всех зон.

Итак, для каждого изображения вы сохраняете n + 1целочисленные значения, где n- количество отслеживаемых зон.

Для сравнения вам также нужно рассматривать каждый цветовой канал индивидуально.

  1. Для всего изображения сравните цветовые каналы для общих цветов, чтобы увидеть, находятся ли они в пределах определенного порога, например, 10%.
  2. Если изображения находятся в пределах порогового значения, затем сравните каждую зону. Если все зоны также находятся в пределах порогового значения, изображения достаточно хорошо совпадают, и вы можете по крайней мере пометить их для дальнейшего сравнения.

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


6

Подобно ответу Ic - вы можете попробовать сравнить изображения в нескольких разрешениях. Таким образом, каждое изображение сохраняется как 1x1, 2x2, 4x4 .. 800x800. Если самое низкое разрешение не совпадает (с учетом порогового значения), вы можете немедленно отклонить его. Если они совпадают, вы можете сравнить их с более высоким разрешением и т. Д.

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


Я думаю, это соответствует некоторому поиску по дереву. Это интересно.
Андре Ласло,

3

Итак, вы хотите выполнить «сопоставление отпечатков пальцев», которое сильно отличается от «сопоставления изображений». Анализ отпечатков пальцев был глубоко изучен в течение последних 20 лет, и было разработано несколько интересных алгоритмов для обеспечения правильной скорости обнаружения (в отношении показателей FAR и FRR - False Acceptance Rate и False Rejection Rate). ).

Я предлагаю вам лучше взглянуть на класс методов обнаружения LFA (Local Feature Analysis) , в основном построенных на проверке мелких деталей. Мелкие детали - это особые характеристики любого отпечатка пальца, которые были разделены на несколько классов. Сопоставление растрового изображения с картой мелких деталей - это то, что на самом деле большинство государственных органов делают для регистрации преступников или террористов.

Видеть здесь для дальнейших ссылок


Знаете ли вы, как рассчитать коэффициент ложного приема, если у вас есть гауссовское распределение оценок для данной биометрической системы?
GobiasKoffi,

OP хочет «создать отпечатки многих изображений». Не сравнивайте изображения человеческих отпечатков пальцев.
Navin


3

По состоянию на 2015 год (назад в будущее ... по этому вопросу 2009 года, который сейчас занимает высокое место в Google) сходство изображений можно вычислить с помощью методов глубокого обучения. Семейство алгоритмов, известных как автокодировщики, может создавать векторное представление, в котором можно искать сходство. Существует демо здесь .


Можно ли создать изображение отпечатка пальца из двоичных данных?
SwR

Конечно, для этой задачи есть ИНС, но ваш ответ, похоже, ни на что не отвечает. Вопрос: как это сделать? Связанная страница не раскрывает никакой информации, и термин «автокодировщики» тоже не помогает.
Саймон Штайнбергер

Исходный вопрос не говорит «Как это делается?», но говорит, что «некоторые подсказки по существующим алгоритмам мне очень помогут», что я и предоставил.
Alex R

Вы не связали «подсказку» с алгоритмом, на самом деле на связанной странице написано: «Это работает, но никто не знает почему. Пожалуйста, не ожидайте слишком многого от результата» ...
odyth

Этот deeplearning4j.org/deepautoencoder#use-cases дает больше ясности о том, как можно использовать автокодировщики для создания отпечатка пальца, а затем о том, как вы можете использовать этот отпечаток пальца для поиска сходства в других изображениях на основе того, насколько похожи вершины.
odyth

2

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

Ваш начальный прогон - O (n ^ 2), но если вы каталогизируете все совпадения, каждое новое изображение будет просто алгоритмом O (n) для сравнения (вам нужно только сравнить его с каждым ранее вставленным изображением). Однако в конечном итоге он сломается, поскольку список изображений для сравнения станет больше, но я думаю, что на какое-то время вы в безопасности.

После 400 дней работы у вас будет 500 000 изображений, что означает (без учета времени на уменьшение размера изображения) 200(H)*200(W)*500,000(images)*3(RGB)= 60 000 000 000 сравнений. Если каждое изображение будет точным совпадением, вы будете отставать, но, вероятно, это не так, верно? Помните, что вы можете дисконтировать изображение как совпадающее, как только одно сравнение выходит за пределы вашего порогового значения.


2

Вы буквально хотите сравнить каждое изображение с другими? Какое приложение? Может быть, вам просто нужна какая-то индексация и поиск изображений на основе определенных дескрипторов? Тогда, например, вы можете посмотреть стандарт MPEG-7 для интерфейса описания мультимедийного контента. Затем вы можете сравнить различные дескрипторы изображений, что будет не так точно, но намного быстрее.


может быть выбор между исчерпывающим и ограниченным
Джонни

0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.