2010-01-10 2 views
9

Какой лучший подход к сравнению двух изображений с php и Graphic Draw (GD) Library?Сравнение изображений с php + gd

Это сценарий:

alt text http://img262.imageshack.us/img262/4849/imagecomparison.jpg

У меня есть изображение, и я хочу, чтобы выяснить, какие изображения данного набора является наиболее близким к нему. Самое похожее изображение - это то же изображение, а не идеальное совпадение пикселей, но одно и то же изображение. Я проиллюстрировал разницу между двумя изображениями с номером один на примере, чтобы облегчить понимание того, что я имел в виду.

Несмотря на то, что результаты не привели к постоянным результатам, мой подход состоял в том, чтобы уменьшить изображение до 1px с помощью функции imagecopyresampled и посмотреть, как близко значения RGB между изображениями.

Сумма значений вычитания каждого красного, зеленого и синего десятичного эквивалентного значения из красного, зеленого и синего десятичного эквивалентного значения возможного соответствия дала мне индекс различий, который, хотя и не работал должным образом поскольку не всегда, наиболее похожее изображение RGB было целевым изображением, я мог бы использовать для выбора изображения из доступных целей.

Вот пример вывода при сравнении 4 изображений от целевого изображения, в этом случае яблоко логотип, который соответствует одному из них, но это не совсем то же самое:

Исходное изображение:

http://www.lshtm.ac.uk/its/remote/images/os-apple.png Red: 222 Green: 226 Синий: 232

по сравнению с:

http://a1.twimg.com/profile_images/571171388/logo-twitter_normal.png Красный: 183 Зеленый: 212 Синий: 212 и индекс подобия 56

http://icons-search.com/img/fasticon/fruits_lnx.zip/fruits_lnx-Icons-48X48-apple.png-48x48.png Red: 117 Green: 028 Синий: 028 и индекс несходства 530

http://www.1sd.org/wp-content/uploads/2008/10/48x48-apple.png Красный: 218 Зеленый : 221 Синий: 221 и индекс несходства Соответствует Правильно.

Red: 061 Green: 063 Синих: 063 и индекс несходства 491

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

Я открыт для других библиотек изображений, таких как iMagick, Gmagick или Cairo для php, но я бы предпочел не использовать другие языки, кроме php.

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

+0

Итак, вы хотите победить капчу? –

+0

Не капчу, изображения такие же, как я сказал, не повернуты, ни строк посередине, ни размытости. Это часть более крупного проекта, который у меня есть, и я, похоже, не могу пройти мимо этого эффективно. – johnnyArt

+0

Возможный дубликат [Как обнаружить похожие изображения в PHP?] (Https://stackoverflow.com/questions/4602562/how-to-detect-similar-images-in-php) – DanMan

ответ

4

Я бы подумал, что ваш подход кажется разумным, но уменьшение всего изображения до размера 1x1 пикселей, вероятно, слишком далеко.

Однако, если вы конвертировали каждое изображение в один размер и затем вычисляли средний цвет в каждом из 16x16 (или 32x32, 64x64 и т. Д. В зависимости от того, сколько времени/мощности вы хотите использовать), вы должны быть способны чтобы сформировать какое-то разумное (-иш) сравнение.

+0

Закончен с использованием моего кода и с тех пор, как вы сказал, что это разумно, тогда эй, ты получишь принятый ответ. – johnnyArt

+0

Извините за то, что вы активировали старую нить, но я точно в той же ситуации. Спасибо за ссылку imagecopyresampled Я могу изменить размер изображений, но как именно я вычисляю средний цвет в каждом изображении 16x16? –

+1

@ Marci-man На самом базовом уровне вы можете использовать imagecolorat для получения значений RGB для пикселей внутри этой «ячейки», а затем усреднить их для получения значения для ячейки в целом. –

-1

Используя методы middparka, вы можете преобразовать каждое изображение в последовательность числовых значений, а затем использовать the Levenshtein algorithm, чтобы найти ближайшее совпадение.

+2

Как может помочь алгоритм Левенштейна? Цитирование «Расстояние Левенштейна между двумя строками определяется минимальным количеством операций, необходимых для преобразования одной строки в другую», и поскольку все последовательности будут образованы тремя 2-значными числами, количество операций всегда будет 3. Если они имеют одинаковые красные, зеленые или синие значения, что не обязательно означает, что это самый близкий цвет и что более похожее изображение. – johnnyArt

+1

И в качестве бонуса PHP уже имеет функцию levenshtein: http://php.net/manual/en/function.levenshtein.php – Marko

0

Я бы предположил, что, как и middaparka, вы не можете использовать только изображение с 1 пикселем, потому что вы теряете всю пространственную информацию. Снижение дискретизации до 16x16 (или 32x32 и т. Д.), Несомненно, обеспечит лучшие результаты.

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

Смежные вопросы