Jeśli obrazy są prawie identyczne i są po prostu przetłumaczone (tj. nie przekrzywione, obrócone, skalowane itp.), Można spróbować użyć korelacji krzyżowej.
Po korelacji krzyżowej obrazu ze sobą (jest to autokorelacja), maksymalna wartość będzie w centrum wynikowej macierzy. Jeśli przesuniesz obraz w pionie lub poziomie, a następnie porównasz go z obrazem oryginalnym, pozycja wartości maksymalnej zmieni się odpowiednio. Mierząc przesunięcie w pozycji maksymalnej wartości, w stosunku do oczekiwanej pozycji, można określić, jak daleko obraz został przesunięty w pionie i poziomie.
Oto zabawny przykład w Pythonie. Zacznij od importowania pewne rzeczy, generując obraz testowy, a badanie autokorelacji:
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)
To daje współrzędne max_coords = (39, 59)
. Teraz przetestować podejście, przesunąć obraz do prawej jednej kolumny, dodać kilka losowych wartości po lewej stronie, i znaleźć wartość max w korelacji krzyżowej ponownie:
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)
Daje new_max_coords = (39, 60)
, słusznie wskazując obraz jest przesunięty w poziomie o 1 (ponieważ np.array(new_max_coords) - np.array(max_coords)
to [0, 1]
). Korzystając z tych informacji, możesz przesuwać obrazy, aby zrekompensować tłumaczenie.
Pamiętaj, że jeśli zdecydujesz się pójść tą drogą, możesz mieć dużo problemów. Błędy off-by-one obfitują podczas określania, biorąc pod uwagę wymiary obrazu, gdzie maksymalna współrzędna "powinna" następować po korelacji (tj. Aby uniknąć obliczania autokorelacji i empirycznego ustalenia tych współrzędnych), szczególnie jeśli obrazy mają równomierną liczba wierszy/kolumn. W powyższym przykładzie centrum to tylko [num_rows-1, num_cols-1]
, ale nie jestem pewien, czy to bardziej bezpieczne założenie.
Ale w wielu przypadkach - szczególnie tych z obrazami, które są prawie dokładnie takie same i przetłumaczone na język angielski - to podejście powinno działać całkiem nieźle.
Czy obrazy są przekrzywione? Lub po prostu przetłumaczone, jak sugeruje "przesunięte o kilka pikseli na każdej osi"? – ohruunuruus
właśnie przeniósł. Naprawiłem frazowanie. –