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

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

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

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Вы должны обязательно взглянуть на phash.

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

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

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

Это демонстрация видеогистограмм: https://redaktorcms.com/dev/globetrottr/testHashVideo.php

Ответ 4

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

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

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

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

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

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

Ответ 5

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

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

Ответ 6

или вы можете использовать http://tineye.com который делает именно то, что вы хотите! (проверьте коммерческий API)

но меня интересует, как они это делают, какие технологии и т.д.

Ответ 7

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

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

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

Ответ 8

Для сравнения изображений iPhone и подобия изображения: http://sites.google.com/site/imagecomparison/

Чтобы увидеть это в действии, просмотрите визуальный поиск eyeBuy в iTunes AppStore.

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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