2016-03-18 2 views
6

У меня будет два изображения.Сделать изображения пересекающимися, несмотря на перевод

Они будут либо одинаковыми, либо почти одинаковыми.

Но иногда любое изображение может быть перемещено на несколько пикселей по любой оси.

Что было бы лучшим способом определить, происходит ли такое движение?

Или еще лучше, каким будет лучший способ манипулирования изображениями, чтобы они исправили это нежелательное движение?

+1

Являются ли изображения искаженными? Или просто переводится, как предполагает «перемещение на несколько пикселей по любой оси»? – ohruunuruus

+0

только что переехал. Я исправил формулировку. –

ответ

2

Если изображения на самом деле почти идентичны и просто переведены (т.е. не перекошены, повернуты, масштабированы и т. Д.), Вы можете попробовать использовать кросс-корреляцию.

Когда вы перекрестно сопоставляете изображение с собой (это автокорреляция), максимальное значение будет находиться в центре результирующей матрицы. Если вы перемещаете изображение по вертикали или по горизонтали, а затем перекрестно коррелируете с исходным изображением, позиция максимального значения будет соответственно изменяться. Измеряя сдвиг в позиции максимального значения относительно ожидаемого положения, вы можете определить, как далеко изображение было переведено вертикально и горизонтально.

Вот пример игрушки на питоне. Начните импортировать некоторые вещи, создавая тестовое изображение, и изучению автокорреляции:

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], но я не уверен, что это безопасное предположение в целом.

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