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

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

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

Заранее спасибо:)

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Вы можете использовать эту библиотеку https://github.com/sapientpro/image-comparator - она ​​использует перцепционный хеш под капотом. Вы также можете сравнить с ним несколько изображений.

Пример:

      $comparator = new SapientPro\ImageComparator\ImageComparator()

$similarity = $comparator->compare('your-images/your-image1.jpg', 'your-images/your-image12.jpg');

echo $similarity; //72.7
Другие вопросы по тегам