Найти похожие изображения в (чистом) PHP/MySQL - программирование
Подтвердить что ты не робот

Найти похожие изображения в (чистом) PHP/MySQL

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

Я нашел несколько интересных решений, таких как http://www.pureftpd.org/project/libpuzzle или или http://phash.org/ и т.д., но они получили одну или несколько проблем.

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

Я был бы в порядке, чтобы найти только ОЧЕНЬ похожие изображения (например, разный размер, сохраненный jpg или другой коэффициент сжатия jpg).

Единственная идея, которую я получил, - изменить размер изображения, например. 5px * 5px * 256 цветов, создайте строковое представление, а затем найдите то же самое. Но я предполагаю, что это может создать небольшие различия в цветах даже с двумя одинаковыми изображениями разного размера, поэтому найти только 100% то же самое было бы бесполезно.

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

Есть ли простой способ?

4b9b3361

Ответ 1

У меня была эта точная та же проблема.

Не стесняйтесь копировать то, что я сделал, и, надеюсь, это поможет вам решить вашу проблему.


Как я его решил

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

Следующий параметр (который работает) был меньшим изображением (например, вашей идеей 5px), и я сделал именно это, но с изображениями 10px * 10px. То, как я создал "хэш" для каждого изображения, было imagecolorat().

Смотрите здесь php.net.

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

, например:

// Pixel RGB
rgb(105, 126, 225) // Original
rgb(100, 150, 250) // After rounding numbers to nearest 50

После выполнения этого для каждого пикселя (10px * 10px даст вам 100 rgb() назад), я затем превратил их в массив и сохранил их в базе данных как base64_encode() и serialize().

Выполняя поиск похожих изображений, я сделал тот же самый процесс с изображением, который они хотели загрузить, а затем извлек "хэши" изображений из базы данных, чтобы сравнить их все, и посмотрим, что соответствовало закругленному rgb 's.


Советы

  • Большой, который 50 находится в округлении rgb, менее конкретный ваш поиск будет (и наоборот).

  • Если вы хотите, чтобы ваш SQL был более конкретным, может быть лучше сохранить дополнительную/конкретную информацию об изображении в базе данных, чтобы вы может ограничить поиск, который вы получаете в базе данных. , например,. если соотношение сторон 4:3, вытащите изображения из 4:3 из базы данных. (И т.д.)

  • Трудно получить это отлично 5px * 5px, поэтому предложение phpthumb. Я использовал его с синтаксисом:

phpthumb.php?src=IMAGE_NAME_HERE.png&w=10&h=10&zc=1
// &w=  width of your image
// &h=  height of your image
// &zc= zoom control. 0:Keep aspect ratio, 1:Change to suit your width+height

Удачи, надеюсь, я мог бы помочь.

Ответ 2

Для простой PHP-версии: https://github.com/kennethrapp/phasher

Однако - интересно, есть ли встроенная функция mySql для "сравнения" (см. выше класс php)

Ответ 3

Я уменьшаю изображение до 8x8, затем конвертирую RGB в 1-байтовый HSV, поэтому хеш результата составляет 172 байта.

HSVHSVHSVHSVHSVHSVHSVHSV... (from 8x8 block, 172 bytes long)
0fff0f3ffff4373f346fff00...

Он не на 100% точным (некоторые дубликаты не найдены), но он работает хорошо и выглядит так, что нет ложных положительных результатов.

Ответ 4

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

Теперь остается только определить функцию подобия. Честно говоря, это специфическая проблема. Это зависит от того, что вы называете похожим. Но covariance, как правило, является хорошей отправной точкой, вам просто нужны ваши два изображения того же размера, которые, я думаю, не имеют большого значения, Тем не менее вы можете найти множество других идей, которые ищут "меры сходства между двумя изображениями".