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