Кросс-корреляция между двумя изображениями

Как выбрать случайную точку на одном изображении, а затем найти ее соответствующую точку на другом изображении, используя кросс-корреляцию?

Итак, в основном у меня есть image1, я хочу выбрать точку на нем (автоматически), затем найти соответствующую/подобную точку на изображении2.

Вот несколько примеров изображений:

Изображение:

full image

Patch:

patch

Результат кросс-корреляции:

result of cross correlation

Ответ 1

Ну, xcorr2 можно по существу рассматривать как анализ всех возможных сдвигов как в положительном, так и в отрицательном направлении и давая оценку того, насколько хорошо они соответствуют каждому сдвигу. Поэтому для изображений размера N x N результат должен иметь размер (2*N-1) x (2*N-1), где корреляция в индексе [N, N] была бы максимальной, если бы два изображения были одинаковыми или не сдвинутыми. Если бы они были сдвинуты на 10 пикселей, максимальная корреляция была бы на уровне [N-10, N] и так далее. Поэтому вам нужно будет вычесть N, чтобы получить абсолютный сдвиг.

С вашим фактическим кодом, вероятно, будет легче помочь. Но давайте посмотрим на пример:

(A) Мы читаем изображение и выбираем два разных суб-изображения с смещениями da и db

Orig = imread('rice.png');
N = 200; range = 1:N;
da = [0 20];
db = [30 30];
A=Orig(da(1) + range, da(2) + range);
B=Orig(db(1) + range, db(2) + range);

(b) Рассчитайте взаимную корреляцию и найдите максимум

X = normxcorr2(A, B);
m = max(X(:));
[i,j] = find(X == m);

(C) Зафиксируйте их вместе, используя восстановленный сдвиг

R = zeros(2*N, 2*N);
R(N + range, N + range) = B;
R(i + range, j + range) = A;

(D) Иллюстрировать вещи

figure
subplot(2,2,1), imagesc(A)
subplot(2,2,2), imagesc(B)
subplot(2,2,3), imagesc(X)
rectangle('Position', [j-1 i-1 2 2]), line([N j], [N i])
subplot(2,2,4), imagesc(R);

(E) Сравнить умышленный сдвиг с восстановленным сдвигом

delta_orig = da - db
%--> [30 10]
delta_recovered = [i - N, j - N]
%--> [30 10]

Как вы видите в (E), мы получаем точно сдвиг, который мы интуитивно введем в (A).

Result of xcorr2


Или скорректирован на ваш случай:

full=rgb2gray(imread('a.jpg'));
template=rgb2gray(imread('b.jpg'));
S_full = size(full);
S_temp = size(template);

X=normxcorr2(template, full);
m=max(X(:));
[i,j]=find(X==m);

figure, colormap gray
subplot(2,2,1), title('full'), imagesc(full)
subplot(2,2,2), title('template'), imagesc(template), 
subplot(2,2,3), imagesc(X), rectangle('Position', [j-20 i-20 40 40])

R = zeros(S_temp);
shift_a = [0 0];
shift_b = [i j] - S_temp;
R((1:S_full(1))+shift_a(1), (1:S_full(2))+shift_a(2)) = full;
R((1:S_temp(1))+shift_b(1), (1:S_temp(2))+shift_b(2)) = template;
subplot(2,2,4), imagesc(R);

enter image description here

Однако, чтобы этот метод работал правильно, патч (template) и полное изображение должны масштабироваться до одного и того же разрешения.


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