Я пытаюсь вычислить сходство (читай: расстояние Левенштейна) двух изображений, используя Python 2.6 и PIL.
Я планирую использовать библиотеку python-levenshtein для быстрого сравнения.
Главный вопрос:
Какая стратегия сравнения изображений хорошая? Моя идея примерно такая:
- Преобразовать в RGB (прозрачный -> белый) (или, может быть, преобразовать в монохромный?)
- Увеличивайте размер меньшего до большего
- Преобразуйте каждый канал (= единственный канал, если он преобразован в монохромный) в последовательность (значение элемента = значение цвета пикселя)
- Рассчитайте расстояние Левенштейна между двумя последовательностями
Конечно, это не будет обрабатывать такие случаи, как зеркальные изображения, обрезанные изображения и т. Д. Но для базового сравнения это должно быть полезно.
Есть ли где-нибудь лучшая стратегия?
РЕДАКТИРОВАТЬ: Аарон Х. прав насчет скорости. Расчет Левелштейна для изображений размером больше нескольких сотен на несколько сотен пикселей занимает вечность. Однако разница между результатами после масштабирования до 100x100 и 200x200 в моем примере составляет менее 1%, поэтому было бы разумно установить максимальный размер изображения ~ 100 пикселей или около того ...
РЕДАКТИРОВАТЬ: Спасибо PreludeAndFugue, это то, что я искал.
Кстати, расстояние Левенштейна, кажется, можно оптимизировать, но это дает мне очень плохие результаты, возможно, из-за большого количества повторяющихся элементов на заднем плане. Надо посмотреть на некоторые другие алгоритмы.
EIDT: среднеквадратичное отклонение и пиковое отношение сигнал / шум, кажется, еще два варианта, которые не очень сложно реализовать и, по-видимому, не очень затратны для ЦП. Однако, похоже, мне понадобится какой-то контекстный анализ для распознавания форм и т. Д.
В любом случае, спасибо за все ссылки, а также за указание направления в сторону NumPy / SciPy.