Измерение сдвига между двумя изображениями только в одном направлении - PullRequest
0 голосов
/ 15 октября 2019

Я должен измерить сдвиги между двумя монохроматическими изображениями.

Эти изображения на самом деле представляют собой спектры перед калибровкой, которые очень шумные и полны нежелательных функций, но в основном они выглядят следующим образом: abstract image of a spectrum

I знаю что между разными изображениями они имеют сдвиги вдоль оси x, но не вдоль оси y. И я хочу знать величину сдвига по оси X между ними.

К счастью, я нашел функцию в skimage, register_translation, которую можно использовать для произвольной подпиксельной точности. Но проблема в том, что я хочу знать сдвиг только по оси x, и я хочу, чтобы результирующий сдвиг по оси y был равен 0, но программа находит сдвиг к x и y одновременно, предположительно, в направлении, перпендикулярном направлениюфункции. (помечено на рисунке синей стрелкой) pixel coordinates and

Итак, мне интересно:

  1. есть ли какая-либо функция или пакет в python, который измеряет сдвиг между двумя изображениями только в одном направлении, или даже с какими-либо предварительными знаниями?

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

Ответы [ 4 ]

1 голос
/ 16 октября 2019

Я не уверен, что это сработает, но: одно из преимуществ открытого исходного кода заключается в том, что вы можете посмотреть подробности реализации из register_translation, а затем попытаться адаптировать его к вашему случаю. В вашем случае я бы заменил fftn на fftn(..., axis=1), чтобы вы вычисляли только fft вдоль оси столбцов. Затем умножьте два сигнала FFT вместе (это эквивалентно свертке каждой строки, как предлагает @CypherX). Наконец, вы должны найти способ «объединить» сдвиги, найденные вдоль каждой линии, в одно измерение. Одна идея состояла бы в том, чтобы взять каждую смену (максимум вдоль этой линии) и построить гистограмму. Хотелось бы надеяться, что вы получите резкий пик вокруг истинного сдвига x.

Если это сработает, было бы очень хорошим вкладом в scikit-image добавить аргумент ключевого слова axis к register_translation. Вы можете прочитать , как внести руководство и предложить соответствующее изменение!

0 голосов
/ 16 ноября 2019

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

Я обычно использую этот подход для обнаружения сдвига, аналогичного вашемупроблема, и это очень, очень быстро, очень просто и очень надежно.

# pick a row to use
row = 10
x_profile1 = np.mean(image1[row, :], axis=0)
x_profiel2 = np.mean(image2[row, :], axis=0)

# 'get_peaks' is a function to return indices of found peaks - several
# around
peaks1 = get_peaks(x_profile1)
peaks2 = get_peaks(x_profile2)

x_shift = peaks1[0] - peaks2[0]
0 голосов
/ 07 ноября 2019

Некоторые простые математические вычисления должны сработать в этой ситуации, если register_translation дает вам сдвиг xy, будь то в векторной или компонентной форме. Вы можете рассчитать движение в x, которое потребовалось бы, если бы сдвиг y не существовал, чего вы и хотите. Я путешествую, поэтому, к сожалению, не могу дать вам график прямо сейчас, рекомендую нарисовать треугольники.

Требуется дополнительный сдвиг x (x_extra):

x_extra = y * tan[arctan(y_shift/x_shift)]

Что упрощено до:

x_extra = y_shift^2 / x_shift

Следовательно, общее смещение по x равно:

x_shift_total = x_shift + x_extra

Где x_shift дан вам register_translation.

Если вы затем переместите imageA на x_shift_total, он должен быть выровнен с imageB, предполагая, что x_shift, заданный register_translation, является правильным.

@ jni Я хотел бы реализовать этокак вариант в register_translation!

0 голосов
/ 15 октября 2019

Method-1

Вы можете использовать convolution между двумя изображениями, чтобы найти, где вы получите maximum. Вы могли бы представить это как перемещение неперемещенных изображений по смещенному изображению слева направо, и свертка будет давать максимумы, соответствующие сценарию, когда идентичные участки каждого изображения лежат друг над другом. Посмотрите на scipy.ndimage.convolution и scipy.signal.convolve и посмотрите, какой из них лучше соответствует вашим потребностям.

Метод-2

  1. С другой стороны, вы можете взять горизонтальный срез с каждого изображения и найти положение пиков (при условии, что черные полосы равны 1, а белые области равны 0). ).
  2. Рассчитайте центроиды этих пиков на каждом изображении. Найдите разницу между позициями этих центроидов и смещением, которое вы ищете.
  3. Для надежности вы можете применить это к различным строкам пар изображений, и среднее значение всех таких различий будет более статистически достоверным результатом для измерения горизонтального сдвига.
...