Делайте изображения перекрывающимися, несмотря на перевод
У меня будет два изображения.
Они будут либо одинаковыми, либо почти одинаковыми.
Но иногда любое из изображений могло быть перемещено на несколько пикселей по любой оси.
Как лучше всего определить, происходит ли такой шаг?
Или, что еще лучше, как лучше всего манипулировать изображениями, чтобы они исправили это нежелательное движение?
1 ответ
Если изображения действительно почти идентичны и просто переведены (то есть не перекошены, повернуты, масштабированы и т. Д.), Вы можете попробовать использовать взаимную корреляцию.
Когда вы взаимно коррелируете изображение с самим собой (это автокорреляция), максимальное значение будет в центре результирующей матрицы. Если вы смещаете изображение по вертикали или горизонтали, а затем взаимно коррелируете с исходным изображением, положение максимального значения будет соответственно смещаться. Измеряя сдвиг в позиции максимального значения относительно ожидаемой позиции, вы можете определить, как далеко изображение было переведено по вертикали и горизонтали.
Вот игрушечный пример на питоне. Начните с импорта некоторого материала, создания тестового изображения и изучения автокорреляции:
import numpy as np
from scipy.signal import correlate2d
# generate a test image
num_rows, num_cols = 40, 60
image = np.random.random((num_rows, num_cols))
# get the auto-correlation
correlated = correlate2d(image, image, mode='full')
# get the coordinates of the maximum value
max_coords = np.unravel_index(correlated.argmax(), correlated.shape)
Это дает координаты max_coords = (39, 59)
, Теперь, чтобы проверить подход, сдвиньте изображение вправо на один столбец, добавьте несколько случайных значений слева и снова найдите максимальное значение в кросс-корреляции:
image_translated = np.concatenate(
(np.random.random((image.shape[0], 1)), image[:, :-1]),
axis=1)
correlated = correlate2d(image_translated, image, mode='full')
new_max_coords = np.unravel_index(correlated.argmax(), correlated.shape)
Это дает new_max_coords = (39, 60)
, правильно указывая изображение смещено по горизонтали на 1 (потому что np.array(new_max_coords) - np.array(max_coords)
является [0, 1]
). Используя эту информацию, вы можете сдвигать изображения для компенсации перевода.
Обратите внимание, что, если вы решите пойти по этому пути, у вас может быть много перегибов, чтобы сработать. При определении, учитывая размеры изображения, встречаются единичные ошибки, где максимальная координата "должна" следовать за корреляцией (то есть, чтобы избежать вычисления автокорреляции и определения этих координат эмпирически), особенно если изображения имеют четную количество строк / столбцов. В приведенном выше примере центр просто [num_rows-1, num_cols-1]
но я не уверен, что это безопасное предположение в целом.
Но во многих случаях - особенно с изображениями, которые почти точно такие же и только переведены - этот подход должен работать довольно хорошо.