Сравнение (похожих) изображений с Python / PIL

Я пытаюсь вычислить сходство (читай: расстояние Левенштейна) двух изображений, используя Python 2.6 и PIL.

Я планирую использовать библиотеку python-levenshtein для быстрого сравнения.

Главный вопрос:

Какая стратегия сравнения изображений хорошая? Моя идея примерно такая:

  • Преобразовать в RGB (прозрачный -> белый) (или, может быть, преобразовать в монохромный?)
  • Увеличивайте размер меньшего до большего
  • Преобразуйте каждый канал (= единственный канал, если он преобразован в монохромный) в последовательность (значение элемента = значение цвета пикселя)
  • Рассчитайте расстояние Левенштейна между двумя последовательностями

Конечно, это не будет обрабатывать такие случаи, как зеркальные изображения, обрезанные изображения и т. Д. Но для базового сравнения это должно быть полезно.

Есть ли где-нибудь лучшая стратегия?

РЕДАКТИРОВАТЬ: Аарон Х. прав насчет скорости. Расчет Левелштейна для изображений размером больше нескольких сотен на несколько сотен пикселей занимает вечность. Однако разница между результатами после масштабирования до 100x100 и 200x200 в моем примере составляет менее 1%, поэтому было бы разумно установить максимальный размер изображения ~ 100 пикселей или около того ...

РЕДАКТИРОВАТЬ: Спасибо PreludeAndFugue, это то, что я искал.

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

EIDT: среднеквадратичное отклонение и пиковое отношение сигнал / шум, кажется, еще два варианта, которые не очень сложно реализовать и, по-видимому, не очень затратны для ЦП. Однако, похоже, мне понадобится какой-то контекстный анализ для распознавания форм и т. Д.

В любом случае, спасибо за все ссылки, а также за указание направления в сторону NumPy / SciPy.


person Attila O.    schedule 08.04.2010    source источник
comment
Я не могу ответить прямо, но подозреваю, что из-за потери точности данных при увеличении масштаба между ними будет большое расстояние, и уменьшение масштаба может привести к более тесной взаимосвязи между ними. - Что касается расстояния Левенштейна, я понятия не имею, но эта цитата из Википедии заставляет меня скептически относиться к его полезности в этом приложении: расстояние Левенштейна также может быть вычислено между двумя более длинными строками, но стоимость его вычисления, которая составляет примерно пропорциональна произведению двух длин струн, что делает это непрактичным.   -  person Aaron H.    schedule 09.04.2010
comment
Этот вопрос может помочь: stackoverflow.com/questions/613146/   -  person Gary Kerr    schedule 09.04.2010
comment
Кроме того, преобразуйте изображение PIL в массив numpy для выполнения математических манипуляций. numpy предназначен для работы с большими массивами числовых данных. В этом вопросе показана процедура: stackoverflow.com/questions/384759/pil-and-numpy   -  person Gary Kerr    schedule 09.04.2010


Ответы (2)


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

Если вы хотите сохранить простоту, вы можете сначала уменьшить количество цветов и разрешение, а затем рассчитать расстояние.

person Wolph    schedule 08.04.2010
comment
Как выяснилось, проблема с вычислением расстояния в том, что это не очень хорошо для поиска аналогичного содержания в изображениях, поскольку большая часть фона идентична; Думаю, здесь мне нужен более надежный алгоритм. - person Attila O.; 09.04.2010
comment
В этом случае вам, вероятно, понадобится анализ Фурье, чтобы обнаружить линии на изображении и сравнить формы. Но сделать это немного сложнее. Хотя scipy, вероятно, может вам очень помочь в этой области. - person Wolph; 09.04.2010

Ознакомьтесь с imgSeek:

imgSeek - это коллекция бесплатных проектов визуального подобия с открытым исходным кодом. Запрос (изображение, которое вы ищете) может быть выражен либо в виде наброска, нарисованного пользователем, либо в виде другого изображения, которое вы предоставляете (или изображения в вашей коллекции). Алгоритм поиска использует вейвлет-разложение изображений запроса и базы данных с множественным разрешением.

person Udi    schedule 27.10.2011