Сравнение изображений с php + gd - PullRequest
9 голосов
/ 10 января 2010

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

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

alt text

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

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

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

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

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

Красный: 222 Зеленый: 226 Синий: 232

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

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

Красный: 117 Зеленый: 028 Синий: 028 и индекс различия 530

Красный: 218 Зеленый: 221 Синий: 221 и индекс отличия 13 Соответствует правильно.

image Red:061 Green:063 Blue:063 and an index of dissimilarity 491

May not even be doable better with better results than what I'm already getting and I'm wasting my time here but since there seems to be a lot of experienced php programmers I guess you can point me in the right directions on how to improve this.

I'm open to other image libraries such as iMagick , Gmagick или Cairo для php, но я бы предпочел не использовать другие языки, кроме php.

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

Ответы [ 3 ]

4 голосов
/ 10 января 2010

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

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

0 голосов
/ 11 января 2010

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

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

0 голосов
/ 10 января 2010

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

...