Сравнение изображений в 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