Как оценить субпиксельное смещение между изображениями с неравномерным сдвигом / поворотом - PullRequest
2 голосов
/ 15 мая 2019

У меня есть несколько изображений, которые полностью перекрывают одну и ту же сцену. Но есть небольшой сдвиг между всеми изображениями, примерно 1 пиксель или меньше, поэтому сдвиг субпикселя. Допустим, это проблема (1): как я могу оценить этот субпиксельный сдвиг между двумя изображениями (на самом деле, я знаю, как и я пишу код об этом ниже). Я использовал Python здесь.

Помимо задачи (1), существует проблема (2), связанная с неравномерным сдвигом на полном изображении. Давайте дадим изображение A и изображение B, в левом верхнем углу, изображение A смещено примерно на 1 пиксель от изображения B по осям x и y, но в центре изображение A смещено в 0.5px по сравнению с изображением B также по осям x и y. Сдвиг между изображениями A и B не является равномерным по всей поверхности изображения. Проблема заключается в том, как я могу оценить это неравномерное смещение, давайте обозначим его как смещенную поверхность для всех пикселей для всех изображений (взяв одно в качестве эталона) (у меня есть решение и для этого вопроса, я объясню его ниже).

Наконец, задача (3) собирается сдвинуть изображение с оцененной поверхностью сдвига (рассчитанной по (2)). Я знаю, как сместить изображение до 0,5 пикселей по оси X и 1,2 пикселей по оси Y, например. Но я не знаю, как сдвигать массив с определенным сдвигом для каждого пикселя.

Мои решения:

Задача (1): Эта проблема может быть решена с помощью взаимной корреляции в четырехмерном пространстве. Функция уже существует в библиотеке scipy: register_translation ссылка здесь , мне просто нужно дать два изображения в качестве параметров и необходимую точность с плавающей точкой.

Проблема (2): Помните, что сдвиг не является равномерным по всей поверхности изображения. То, что я сделал, в основном для окна размером 500x500 пикселей, сдвиг является равномерным и может быть легко оценен из задачи (1). Итак, я рассчитал сдвиг по всей поверхности изображения с окном 500x500px и шагом 100px. Таким образом, теперь я оценил неравномерный сдвиг, как показано ниже non-uniform shift estimated. Затем я могу интерполировать поверхность из этого точного предполагаемого сдвига, который даст мне предполагаемый сдвиг для каждого пикселя изображения. Чтобы сделать это, я должен интерполировать поверхность с тем же разрешением изображения. Я сделал это, используя numpy.griddata. Вот результат для обоих компонентов (x и y) x and y components of the non-uniform shift interpolated. Таким образом, я оценил неравномерный сдвиг по всей поверхности изображения.

Проблема (3): Теперь я хочу применить этот сдвиг ко всему изображению. Я не знаю, как это сделать. Чтобы сдвинуть изображение на субпиксель, вы можете использовать функцию из scipy.ndimage nammed fourier_shift, которую вы можете найти здесь , но вы можете задать только один сдвиг для всего изображения. Здесь я хочу указать сдвиг для каждого пикселя изображения.

У вас, ребята, есть идеи для решения проблемы (3)? Кроме того, если вы считаете, что существует простой способ решения проблем 1 и 3, он все равно может быть полезен! Для информации у меня есть 7 изображений размером 16000x26000 пикселей, поэтому для решения задачи (2) потребуется некоторое время.

1 Ответ

1 голос
/ 15 мая 2019

Теперь вам нужно интерполировать исходное изображение в местах (x + x_shift(x,y), y + y_shift(x,y)). Вероятно, scipy.interpolate.interpn является наиболее эффективным способом сделать это.

Я думаю, ваш код будет выглядеть примерно так (не проверено):

import numpy as np
import spicy

# ... (load data, find shifts, etc.)

input_coords = (np.arange(x_size), np.arange(y_size))
output_coords = np.column_stack((
   ( x_shift + input_coords[0] ).ravel(),
   ( y_shift + input_coords[1][None,:] ).ravel() ))
output_image = scipy.interpolate.interpn(input_coords, original_image, output_coords,
                                         method='linear', bounds_error=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...