Сравнение изображений в Stack Overflow

Мой сценарий выглядит следующим образом:
Я должен сохранить 1000 изображений в базе данных, а затем я должен сравнить новое изображение с изображениями базы данных для совпадений (совпадение должно быть 70% или более), чтобы получить изображение наилучшего совпадения из базы данных в php.

Есть ли алгоритм или метод для быстрого сравнения с лучшим результатом …

Заранее спасибо 🙂

1

Решение

Попробуйте этот класс. Он поддерживает получение строки хеша из изображения для хранения в базе данных и сравнения с новым изображением позже:
https://github.com/nvthaovn/CompareImage

Это очень быстрый и точный, хотя и не оптимальный код. У меня есть 20000 фотографий в моей базе данных.

1

Другие решения

Я бы посоветовал вам использовать Perceptual Hash или аналогичный — в основном из соображений производительности. По сути, вы создаете один номер или хэш для каждого изображения ОДНАЖДЫ в вашей базе данных в том месте, где вы его вставляете, и сохраняете этот хэш в базе данных. Затем, когда вы получаете новое изображение для вставки, вы вычисляете его хеш и сравниваете его с предварительно вычисленным хешем всех других изображений, чтобы вам не пришлось перетаскивать все мегабайты пикселей ваших существующих изображений с диска для сравнения. их.

Наилучшие значения pHASH являются масштабно-инвариантными и форматами изображений. Вот статья доктора Нила Кравца … Хеширование восприятия.

ImageMagick также может выполнять перцептивное хеширование и вызывается из PHP — см. Вот.

4

Это полностью зависит от того, насколько умным вы хотите, чтобы алгоритм был.

Например, вот некоторые проблемы:

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

масштабировать до чего-то небольшого, например, 64×64 или 32×32, игнорировать соотношение сторон, использовать алгоритм масштабирования объединения вместо ближайшего пикселя
масштабируйте цветовые диапазоны так, чтобы самый темный был черным, а самый светлый — белым
поверните и переверните изображение так, чтобы самый светлый цвет находился слева вверху, а затем справа вверху было бы темнее, а слева внизу — темнее (конечно, насколько это возможно)
Редактирование Алгоритм комбинированного масштабирования — это алгоритм, который при масштабировании 10 пикселей до одного делает это с помощью функции, которая берет цвет всех этих 10 пикселей и объединяет их в один. Может быть сделано с помощью алгоритмов, таких как усреднение, среднее значение, или более сложных, таких как бикубические сплайны.

Затем вычислите среднее расстояние попиксельно между двумя изображениями.

Чтобы найти возможное совпадение в базе данных, сохраните цвета пикселей как отдельные столбцы в базе данных, индексируйте их несколько (но не все, если вы не используете очень маленькое изображение) и выполните запрос, который использует диапазон для каждого значение пикселя, т.е. каждое изображение, где пиксель в маленьком изображении находится между -5 и +5 изображения, которое вы хотите посмотреть.

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

1
По вопросам рекламы [email protected]