2016-03-18 14 views
6

Będę miał dwa obrazy.Powiel obrazy, pomimo ich przetłumaczenia.

Będą one takie same lub prawie takie same.

Ale czasami jedno z obrazów mogło zostać przesunięte o kilka pikseli na każdej osi.

Jaki byłby najlepszy sposób na wykrycie, czy taki ruch się odbywa?

Albo jeszcze lepiej, jaki byłby najlepszy sposób manipulowania obrazami, aby naprawić ten niechciany ruch?

+1

Czy obrazy są przekrzywione? Lub po prostu przetłumaczone, jak sugeruje "przesunięte o kilka pikseli na każdej osi"? – ohruunuruus

+0

właśnie przeniósł. Naprawiłem frazowanie. –

Odpowiedz

2

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.

Powiązane problemy