Я думаю, что Вы могли просто вычислить евклидово расстояние (т.е. sqrt (сумма квадратов различий, попиксельно)) между яркостью двух изображений, и считать их равными, если это подпадает под некоторый эмпирический порог. И Вы лучше сделали бы это обертывающий функцию C.
Наземное расстояние двигателей могло бы быть точно, в чем Вы нуждаетесь. Это могло бы быть abit, тяжелый для реализации в режиме реального времени все же.
Что относительно того, чтобы вычислить манхэттенское Расстояние из двух изображений. Это дает Вам значения n*n. Тогда Вы могли сделать что-то как среднее число строки для сокращения до значений n и функции по этому для получения одного единственного значения.
Вы видели Алгоритм для нахождения подобных изображений вопрос? Проверьте его для наблюдения предложений.
я предложил бы преобразование вейвлета Ваших кадров (я записал расширение C для того использования преобразование Haar); тогда, сравнивая индексы самого большого (пропорционально) факторы вейвлета между этими двумя изображениями, необходимо получить числовое приближение подобия.
Большинство данных ответов не будет иметь дело с освещением уровней.
я сначала нормализовал бы изображение к стандартному легкому уровню прежде, чем сделать сравнение.
Тривиальная вещь попробовать:
Передискретизируют оба изображения к маленьким миниатюрам (например, 64 x 64) и сравнивают миниатюры попиксельно с определенным порогом. Если исходные изображения будут почти тем же, передискретизируемые миниатюры будут очень похожи или даже точно то же. Этот метод заботится о шуме, который может произойти особенно при слабом освещении сцены. Может даже быть лучше, если Вы идете шкала полутонов.
Два популярных и относительно простых метода: (a) Евклидово расстояние, уже предложенное, или (b) нормализованная взаимная корреляция. Нормализованная взаимная корреляция имеет тенденцию быть заметно более устойчивой к освещению изменений, чем простая взаимная корреляция. Википедия дает формулу для нормализованная взаимная корреляция . Более сложные методы существуют также, но они требуют вполне немного большего количества работы.
Используя подобный numpy синтаксис,
dist_euclidean = sqrt(sum((i1 - i2)^2)) / i1.size dist_manhattan = sum(abs(i1 - i2)) / i1.size dist_ncc = sum( (i1 - mean(i1)) * (i2 - mean(i2)) ) / ( (i1.size - 1) * stdev(i1) * stdev(i2) )
предположение, что i1
и i2
2D массивы полутонового изображения.
Можно сравнить два изображения с помощью функций от PIL.
import Image
import ImageChops
im1 = Image.open("splash.png")
im2 = Image.open("splash2.png")
diff = ImageChops.difference(im2, im1)
различный объект является изображением, в котором каждый пиксель является результатом вычитания значений цвета того пикселя во втором изображении из первого изображения. Используя различное изображение можно сделать несколько вещей. Самый простой - эти diff.getbbox()
функция. Это скажет Вам минимальный прямоугольник, который содержит все изменения между Вашими двумя изображениями.
можно, вероятно, реализовать приближения другого материала, упомянутого здесь с помощью функций от PIL также.
простое решение А:
Кодируют изображение jpeg и ищут существенные изменения в размер файла .
я реализовал что-то похожее с видео миниатюрами и имел большой успех и масштабируемость.