Мне нужно создать отпечатки многих изображений (около 100000 существующих, 1000 новых в день, RGB, JPEG, максимальный размер 800x800), чтобы очень быстро сравнить каждое изображение с каждым другим изображением. Я не могу использовать методы двоичного сравнения, потому что также должны распознаваться почти похожие изображения.
Лучше всего была бы существующая библиотека, но мне бы очень помогли некоторые подсказки по существующим алгоритмам.
image
image-processing
fingerprint
Филип Драйер
источник
источник
Ответы:
Обычные алгоритмы хеширования или вычисления CRC плохо работают с данными изображения. Необходимо учитывать размерный характер информации.
Если вам нужен чрезвычайно надежный отпечаток пальца, такой, что учитываются аффинные преобразования (масштабирование, поворот, перевод, переворачивание), вы можете использовать преобразование Радона в источнике изображения для создания нормативного сопоставления данных изображения - сохраните его с каждым изображением и затем сравните только отпечатки пальцев. Это сложный алгоритм и не для слабонервных.
Возможны несколько простых решений:
Гистограмма яркости (особенно та, которая разделена на компоненты RGB) представляет собой разумный отпечаток пальца для изображения - и может быть реализована довольно эффективно. Вычитание одной гистограммы из другой даст новую историограмму, которую вы можете обработать, чтобы определить, насколько похожи два изображения. Гистограммы, поскольку только они оценивают распределение и появление информации о яркости / цвете, достаточно хорошо обрабатывают аффинные преобразования. Если квантовать информацию о яркости каждого цветового компонента до 8-битного значения, 768 байтов памяти будет достаточно для отпечатка пальца изображения практически любого разумного размера. Гистограммы яркости дают ложные негативы при изменении информации о цвете в изображении. Если вы примените преобразования, такие как контраст / яркость, постеризация, смещение цвета, информация о яркости изменится.
Использование масштабированных изображений - это еще один способ снизить информационную плотность изображения до уровня, который легче сравнивать. При уменьшении менее 10% от исходного размера изображения обычно теряется слишком много информации, чтобы его можно было использовать - поэтому изображение размером 800x800 пикселей можно уменьшить до 80x80 и при этом предоставить достаточно информации для выполнения достойного снятия отпечатков пальцев. В отличие от данных гистограммы, вы должны выполнить анизотропное масштабирование данных изображения, когда исходные разрешения имеют разные соотношения сторон. Другими словами, уменьшение изображения 300x800 до миниатюры 80x80 вызывает деформацию изображения, так что по сравнению с изображением 300x500 (что очень похоже) будет вызывать ложноотрицательные результаты. Отпечатки миниатюр также часто дают ложноотрицательные результаты, когда задействованы аффинные преобразования. Если вы перевернете или поверните изображение,
Комбинирование обоих методов - разумный способ застраховать свои ставки и уменьшить количество ложноположительных и ложноотрицательных результатов.
источник
Существует гораздо менее специальный подход, чем предложенные здесь варианты уменьшенного изображения, который сохраняет их общий характер, но дает гораздо более строгую математическую основу для происходящего.
Возьмите вейвлет Хаара изображения. По сути, вейвлет Хаара - это последовательность различий между изображениями с более низким разрешением и изображениями с более высоким разрешением, но взвешенных по тому, насколько глубоко вы находитесь в «дереве» MIP-карт. Расчет прост. Затем, как только у вас есть вейвлет Хаара, взвешенный соответствующим образом, отбросьте все, кроме k наибольших коэффициентов (с точки зрения абсолютного значения), нормализуйте вектор и сохраните его.
Если вы возьмете скалярное произведение двух из этих нормализованных векторов, это даст вам меру сходства, где 1 будет почти идентичным. Я разместил больше информации здесь .
источник
Вам обязательно стоит взглянуть на phash .
Для сравнения изображений есть этот проект php : https://github.com/kennethrapp/phasher
И мой маленький клон javascript : https://redaktor.me/phasher/demo_js/index.html
К сожалению, он основан на "битовом подсчете", но распознает повернутые изображения. Другой подход в javascript заключался в построении гистограммы яркости изображения с помощью холста. Вы можете визуализировать гистограмму многоугольника на холсте и сравнить этот многоугольник в своей базе данных (например, пространственный mySQL ...)
источник
Compare()
функции вместо того, чтобы сначала загружать изображение. Кроме того, по результатам моего тестирования порог для «очень похожего изображения» должен быть> 90%, а не> 98%.Давным-давно я работал над системой с некоторыми похожими характеристиками, и это приближение алгоритма, которому мы следовали:
Итак, для каждого изображения вы сохраняете
n + 1
целочисленные значения, гдеn
- количество отслеживаемых зон.Для сравнения вам также нужно рассматривать каждый цветовой канал индивидуально.
Это позволяет быстро отбрасывать несоответствующие изображения; вы также можете использовать больше зон и / или применять алгоритм рекурсивно, чтобы повысить достоверность совпадения.
источник
Подобно ответу Ic - вы можете попробовать сравнить изображения в нескольких разрешениях. Таким образом, каждое изображение сохраняется как 1x1, 2x2, 4x4 .. 800x800. Если самое низкое разрешение не совпадает (с учетом порогового значения), вы можете немедленно отклонить его. Если они совпадают, вы можете сравнить их с более высоким разрешением и т. Д.
Кроме того, если изображения имеют схожую структуру, например медицинские изображения, вы можете извлечь эту структуру в описание, которое будет проще / быстрее сравнивать.
источник
Итак, вы хотите выполнить «сопоставление отпечатков пальцев», которое сильно отличается от «сопоставления изображений». Анализ отпечатков пальцев был глубоко изучен в течение последних 20 лет, и было разработано несколько интересных алгоритмов для обеспечения правильной скорости обнаружения (в отношении показателей FAR и FRR - False Acceptance Rate и False Rejection Rate). ).
Я предлагаю вам лучше взглянуть на класс методов обнаружения LFA (Local Feature Analysis) , в основном построенных на проверке мелких деталей. Мелкие детали - это особые характеристики любого отпечатка пальца, которые были разделены на несколько классов. Сопоставление растрового изображения с картой мелких деталей - это то, что на самом деле большинство государственных органов делают для регистрации преступников или террористов.
Видеть здесь для дальнейших ссылок
источник
Для сравнения изображений iPhone и разработки сходства изображений посетите: http://sites.google.com/site/imagecomparison/
Чтобы увидеть это в действии, посмотрите eyeBuy Visual Search в iTunes AppStore.
источник
По состоянию на 2015 год (назад в будущее ... по этому вопросу 2009 года, который сейчас занимает высокое место в Google) сходство изображений можно вычислить с помощью методов глубокого обучения. Семейство алгоритмов, известных как автокодировщики, может создавать векторное представление, в котором можно искать сходство. Существует демо здесь .
источник
Один из способов сделать это - изменить размер изображения и значительно снизить разрешение (может быть, до 200x200?), Сохранив меньшую (усредненную по пикселям) версию для сравнения. Затем определите порог допуска и сравните каждый пиксель. Если RGB всех пикселей находится в пределах допуска, у вас есть совпадение.
Ваш начальный прогон - O (n ^ 2), но если вы каталогизируете все совпадения, каждое новое изображение будет просто алгоритмом O (n) для сравнения (вам нужно только сравнить его с каждым ранее вставленным изображением). Однако в конечном итоге он сломается, поскольку список изображений для сравнения станет больше, но я думаю, что на какое-то время вы в безопасности.
После 400 дней работы у вас будет 500 000 изображений, что означает (без учета времени на уменьшение размера изображения)
200(H)*200(W)*500,000(images)*3(RGB)
= 60 000 000 000 сравнений. Если каждое изображение будет точным совпадением, вы будете отставать, но, вероятно, это не так, верно? Помните, что вы можете дисконтировать изображение как совпадающее, как только одно сравнение выходит за пределы вашего порогового значения.источник
Вы буквально хотите сравнить каждое изображение с другими? Какое приложение? Может быть, вам просто нужна какая-то индексация и поиск изображений на основе определенных дескрипторов? Тогда, например, вы можете посмотреть стандарт MPEG-7 для интерфейса описания мультимедийного контента. Затем вы можете сравнить различные дескрипторы изображений, что будет не так точно, но намного быстрее.
источник
Кажется, что специализированные алгоритмы хеширования изображений являются областью активных исследований, но, возможно, нормальное вычисление хеширования байтов изображения поможет.
Вы ищете изображения, идентичные байтам, а не изображения, которые получены из одного источника, но могут иметь другой формат или разрешение (что кажется мне довольно сложной проблемой)?
источник