Я думаю, фазовая корреляция будет вашим лучшим выбором здесь. Он предназначен для того, чтобы сообщать вам фазовый сдвиг (т.е. перевод) между двумя изображениями. Он намного более устойчив (но не защищен) от шума, чем обнаружение признаков, потому что работает в частотном пространстве; тогда как детекторы функций работают пространственно. Еще одним преимуществом является то, что он очень быстрый по сравнению с методами обнаружения признаков. У меня есть доступная реализация в стволе OpenCV, которая с точностью до субпикселя расположена здесь .
Тем не менее, ваши изображения в значительной степени "безликие", за исключением складки посередине, поэтому даже фазовая корреляция может иметь некоторые проблемы с этим. Думайте об этом как о попытке обнаружить перевод в снежной бури. Если все, что вы видите, - белое, вы не можете сказать, что вы вообще перевели, поэтому термин whiteout . В вашем случае алгоритм может пострадать от "greenout":)
Можете ли вы отрегулировать настройки камеры для лучшей работы в условиях низкой освещенности. Вы полностью открыли радужную оболочку? Можете ли вы жить с более низкой частотой кадров? Установка более длительного времени экспозиции позволит камере собирать больше света, что даст вам больше возможностей за счет добавления размытия в движении. Или, если в качестве среды по умолчанию используется слабое освещение, вы, вероятно, захотите что-то для этого, например, ИК-камеру, но это может быть дорого. Кроме этого, ваш друг - большой объектив и длинные выдержки:)
Выравнивание гистограммы может представлять интерес для улучшения контрастности изображения. Но иногда это может только усилить шум. OpenCV имеет глобальную функцию выравнивания гистограммы, которая называется equalizeHist . Для более локализованной реализации вам нужно взглянуть на Contrast Limited Adaptive Histogram Equalization или CLAHE для краткости. Здесь хорошая статья об этом. На этой странице есть несколько хороших примеров и некоторый код.