Если изображения на самом деле почти идентичны и просто переведены (т.е. не перекошены, повернуты, масштабированы и т. Д.), Вы можете попробовать использовать кросс-корреляцию.
Когда вы перекрестно сопоставляете изображение с собой (это автокорреляция), максимальное значение будет находиться в центре результирующей матрицы. Если вы перемещаете изображение по вертикали или по горизонтали, а затем перекрестно коррелируете с исходным изображением, позиция максимального значения будет соответственно изменяться. Измеряя сдвиг в позиции максимального значения относительно ожидаемого положения, вы можете определить, как далеко изображение было переведено вертикально и горизонтально.
Вот пример игрушки на питоне. Начните импортировать некоторые вещи, создавая тестовое изображение, и изучению автокорреляции:
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]
, но я не уверен, что это безопасное предположение в целом.
Но для многих случаев - особенно с изображениями, которые почти одинаковы, и только переведено - этот подход должен работать очень хорошо.
Являются ли изображения искаженными? Или просто переводится, как предполагает «перемещение на несколько пикселей по любой оси»? – ohruunuruus
только что переехал. Я исправил формулировку. –