найти сдвиг изображения - PullRequest
3 голосов
/ 01 сентября 2009

Как найти сдвиг и вращение между одними и теми же изображениями, используя языки программирования vb.net или C ++ или C #?

Ответы [ 5 ]

6 голосов
/ 01 сентября 2009

Указанная вами проблема называется обнаружение движения (или компенсация движения ) и является одной из наиболее важных проблем в обработке изображений и видео на данный момент. Нелегко «вот десять строк кода, которые это сделают», решение существует, за исключением некоторых действительно тривиальных случаев.

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

1 голос
/ 01 сентября 2009

Если изображения очень похожи, так что камера лишь слегка смещена и повернута, то проблему можно решить без использования очень сложных методов. В этом случае я бы использовал алгоритм отслеживания движения, чтобы получить оптический поток последовательности изображений, представляющий собой «карту», ​​которая приблизительно соответствует тому, как пиксель «переместился» из изображения A в B OpenCV, действительно очень хорошая библиотека, имеет функции, которые делают это: CalcOpticalFlowLK и CalcOpticalFlowPyrLK .

Сложный переход от оптического потока к полному вращению изображения. Я бы начал с фильтра низких частот, чтобы получить более гладкую карту для работы. Затем вам нужно использовать некоторую логику, чтобы проверить, смещено или повернуто изображение. Если это только смещение, то вся карта должна быть одного «цвета», то есть все векторы потока указывают в одном направлении. Если было вращение, то векторы будут указывать разное направление в зависимости от вращения.

Если входные изображения не так хороши, как требует описанный выше метод, то я бы посмотрел на дескрипторы объектов, чтобы найти, как конкретный объект на первом изображении находится во втором. Это, однако, будет гораздо сложнее.

1 голос
/ 01 сентября 2009

Короткого ответа нет. Вы можете попробовать использовать бесплатную библиотеку OpenCV для нахождения отношений между двумя изображениями.

0 голосов
/ 01 сентября 2009

Если изображения в точности одинаковы, должно быть довольно легко извлечь некоторые характерные точки - например, используя SIFT - и сопоставить функции обоих изображений. Затем вы можете использовать любые две подходящие функции, чтобы найти вращение и перевод. Перевод - это только разница между двумя подходящими характерными точками. Вы компенсируете перевод на одном изображении и получаете угол поворота как угол, образованный тремя оставшимися точками.

0 голосов
/ 01 сентября 2009

Две операции, вращение и перевод могут быть определены в любом порядке. Сначала легче обнаружить вращение, потому что вы можете компенсировать это. Как только оба изображения ориентированы одинаково, перевод становится вопросом простой корреляции.

Нахождение относительного поворота изображения лучше всего делать, определяя локальные градиенты. Для каждой окрестности (например, 3 × 3 пикселя) обработайте значение серого как функцию z (x, y), проведите плоскость через 9 пикселей и определите наклон или градиент этой плоскости. Теперь усредните градиент, который вы нашли по всему изображению или, по крайней мере, по центру. Ваши два изображения будут давать разные средние. Частично это связано с тем, что при поворотах не на 90 градусов изображения не будут полностью перекрываться, но в целом разница в средних градиентах заключается в повороте между ними.

После того как вы повернули одно изображение назад, вы можете определить корреляцию. Это довольно стандартная операция; вы по существу определяете, насколько хорошо два изображения перекрываются для каждого возможного смещения. Это даст вам оценку за смену.

Получив оба, вы можете уточнить оценку угла поворота, повернув перевод назад, сместив второе изображение и определив средний градиент только по пикселям, общим для обоих изображений.

...