Выравнивание изображения с помощью ORB и RANSAC в scikit-image

Я пытаюсь выровнять замедленные изображения, используя skimage.feature.orb< /a> для извлечения ключевых точек и последующей их фильтрации с помощью skimage.measure.ransac. Преобразование, смоделированное RANSAC, должно затем выравнивать мои изображения.

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

Я просто неправильно понимаю, как следует применять преобразование или как оно моделируется RANSAC?

# Extract and match features from both images
descriptor_extractor = ORB(n_keypoints = 400, harris_k = 0.0005)
descriptor_extractor.detect_and_extract(image_ref)
descriptors_ref, keypoints_ref = descriptor_extractor.descriptors, descriptor_extractor.keypoints
descriptor_extractor.detect_and_extract(image)
descriptors, keypoints = descriptor_extractor.descriptors, descriptor_extractor.keypoints

# Match features in both images
matches = match_descriptors(descriptors_ref, descriptors, cross_check = True)

# Filter keypoints to remove non-matching
matches_ref, matches = keypoints_ref[matches[:, 0]], keypoints[matches[:, 1]]

# Robustly estimate transform model with RANSAC
transform_robust, inliers = ransac((matches_ref, matches), EuclideanTransform, min_samples = 5, residual_threshold = 0.5, max_trials = 1000)

# Apply transformation to image
image = warp(image, transform_robust.inverse, order = 1, mode = "constant", cval = 0, clip = True, preserve_range = True)

Соответствие ключевых точек

Фактические и ожидаемые результаты

Я получаю аналогичные результаты с другими изображениями. Я также пытался использовать inliers из RANSAC с skimage.transform.estimate_transform, но это дает те же результаты, что и использование transform_robust напрямую.


person Erik White    schedule 09.06.2020    source источник


Ответы (1)


Оказывается, мне нужно было инвертировать перевод перед применением преобразования:

# Robustly estimate transform model with RANSAC
transform_robust, inliers = ransac((matches_ref, matches), EuclideanTransform, min_samples = 5, residual_threshold = 0.5, max_trials = 1000)

# Invert the translation
transform_robust = transform(rotation = transform_robust.rotation) + transform(translation = -flip(transform_robust.translation))

# Apply transformation to image
image = warp(image, transform_robust.inverse, order = 1, mode = "constant", cval = 0, clip = True, preserve_range = True)

Результат не идеален, но корректировка выбора ключевой точки должна привести ее в соответствие введите здесь описание изображения

person Erik White    schedule 11.06.2020
comment
Не могли бы вы уточнить, откуда взялись transform() и flip()? - person Dan; 19.09.2020
comment
flip() из numpy. transform — это локальная переменная, представляющая GeometricTransform из skimage. См. scikit-image.org/docs/dev/api/skimage.transform. .html - person Erik White; 21.09.2020