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



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



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



Alt текст http://img262.imageshack.us/img262/4849/imagecomparison.jpg



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



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



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

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



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



Http://www.lshtm.ac.uk/its/remote/images/os-apple.png
Красный: 222 Зеленый: 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
Красный: 117 зеленый: 028 синий: 028 и индекс несходства 530



Http://www.1sd.org/wp-content/uploads/2008/10/48x48-apple.png
Красный: 218 зеленый: 221 синий: 221 и индекс несходство 13 подобраны правильно.



Красный: 061 зеленый: 063 синий: 063 и индекс непохожести 491



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



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



Заранее благодарю.

674   3  

3 ответов:

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

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

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

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

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

Comments

    Ничего не найдено.