У меня есть несколько изображений, которые полностью перекрывают одну и ту же сцену. Но есть небольшой сдвиг между всеми изображениями, примерно 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. Таким образом, теперь я оценил неравномерный сдвиг, как показано ниже
. Затем я могу интерполировать поверхность из этого точного предполагаемого сдвига, который даст мне предполагаемый сдвиг для каждого пикселя изображения. Чтобы сделать это, я должен интерполировать поверхность с тем же разрешением изображения. Я сделал это, используя numpy.griddata
. Вот результат для обоих компонентов (x и y)
. Таким образом, я оценил неравномерный сдвиг по всей поверхности изображения.
Проблема (3): Теперь я хочу применить этот сдвиг ко всему изображению. Я не знаю, как это сделать. Чтобы сдвинуть изображение на субпиксель, вы можете использовать функцию из scipy.ndimage
nammed fourier_shift
, которую вы можете найти здесь , но вы можете задать только один сдвиг для всего изображения. Здесь я хочу указать сдвиг для каждого пикселя изображения.
У вас, ребята, есть идеи для решения проблемы (3)? Кроме того, если вы считаете, что существует простой способ решения проблем 1 и 3, он все равно может быть полезен! Для информации у меня есть 7 изображений размером 16000x26000 пикселей, поэтому для решения задачи (2) потребуется некоторое время.