2016-03-18 16 views
6

Tôi sẽ có hai hình ảnh.Làm cho hình ảnh chồng lên nhau, mặc dù đang được dịch

Chúng sẽ giống hoặc gần giống nhau.

Nhưng đôi khi một trong hai hình ảnh có thể đã được di chuyển một vài pixel trên một trong hai trục.

Điều gì sẽ là cách tốt nhất để phát hiện nếu có một động thái như vậy xảy ra?

Hoặc tốt hơn nữa, cách tốt nhất để thao tác hình ảnh để chúng khắc phục cho chuyển động không mong muốn này là gì?

+1

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

+0

vừa di chuyển. tôi đã sửa lỗi. –

Trả lời

2

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)[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 vấn đề liên quan