Nếu hình ảnh gần như giống hệt nhau và chỉ được dịch (tức là không phải bị lệch, xoay, thu nhỏ, v.v ...), bạn có thể thử sử dụng tương quan chéo.
Khi bạn tương quan chéo một hình ảnh với chính nó (đây là tương quan tự động), giá trị tối đa sẽ là trung tâm của ma trận kết quả. Nếu bạn thay đổi hình ảnh theo chiều dọc hoặc chiều ngang và sau đó tương quan chéo với hình ảnh ban đầu, vị trí của giá trị tối đa sẽ dịch chuyển tương ứng. Bằng cách đo thay đổi vị trí của giá trị lớn nhất, liên quan đến vị trí mong muốn, bạn có thể xác định khoảng cách một hình ảnh được dịch theo chiều dọc và chiều ngang.
Đây là ví dụ về đồ chơi trong python. Bắt đầu bằng cách nhập một số nội dung, tạo hình ảnh thử nghiệm và kiểm tra tương quan tự động:
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)
Điều này tạo ra tọa độ max_coords = (39, 59)
. Bây giờ để kiểm tra cách tiếp cận, chuyển hình ảnh sang bên phải một cột, thêm một số giá trị ngẫu nhiên ở bên trái, và tìm giá trị tối đa trong tương quan chéo một lần nữa:
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)
Điều này cho phép new_max_coords = (39, 60)
, cho thấy một cách chính xác hình ảnh được bù theo chiều ngang 1 (vì np.array(new_max_coords) - np.array(max_coords)
là [0, 1]
). Sử dụng thông tin này bạn có thể thay đổi hình ảnh để bù đắp cho việc dịch.
Lưu ý rằng, nếu bạn quyết định đi theo cách này, bạn có thể có nhiều vấn đề cần giải quyết. Các lỗi off-by-one rất nhiều khi xác định, cho các kích thước của một hình ảnh, nơi tọa độ tối đa 'nên' được theo sau tương quan (tức là để tránh tính toán tương quan tự động và xác định các tọa độ theo kinh nghiệm), số hàng/cột. Trong ví dụ trên, trung tâm chỉ là [num_rows-1, num_cols-1]
nhưng tôi không chắc đó có phải là giả định an toàn hay không.
Nhưng đối với nhiều trường hợp - đặc biệt là những hình ảnh gần giống y hệt và chỉ được dịch - cách tiếp cận này sẽ hoạt động khá tốt.
Các hình ảnh có bị lệch không? Hoặc chỉ cần dịch, là "di chuyển bởi một vài điểm ảnh trên một trong hai trục" cho thấy? – ohruunuruus
vừa di chuyển. tôi đã sửa lỗi. –