0

Итак, когда я пытаюсь найти шаблон B в большом изображении A, я могу это сделать, найдя максимум взаимной корреляции, например, в пространственном домене:Перекрестная корреляция в частоте и пространственной области - сопоставление шаблона

%  Finding maximum of correlation: 
     phi = normxcorr2(B,A); 
     [ymax, xmax] = find(phi == max(phi(:))); 

%  Find position in original image: 
     ypeak = ymax - size(B,1); 
     xpeak = xmax - size(B,2); 

Но когда я хочу сделать это в частотной области, я получаю неправильные результаты:

%  Calculate correlation in frequency domain: 
     Af = fft2(A); 
     Bf = fft2(B, size(A,1), size(A,2)); 
     phi2f = conj(Af)'*Bf; 

%  Inverse fft to get back to spatial domain:  
     phi2 = real(ifft(fftshift(phi2f))); 

%  Now we have correlation matrix, excatly the same as calculated in 
%  the spatial domain. 
     [ymax2, xmax2] = find(phi2 == max(phi2(:))); 

Я не понимаю, что я делаю неправильно в частотной области. Я пробовал это без fftshift, это дает другой результат, хотя и неправильный. Как я могу сделать это правильно?

+0

Глядя на определение 'normcorr2', я думаю, мы можем предположить, что B ваш шаблон и А ваш образ? Я думаю, было бы хорошо, если бы вы добавили это, просто для ясности. – kkuilla

+1

@kkuilla отредактировал – Vidak

+0

И если у вас есть изображения, добавьте их вместе с ожидаемым и реальным выходом, чтобы он стал повторяемым. – kkuilla

ответ

1

Это должно сделать трюк:

t = imread('cameraman.tif'); 
a = imtranslate(t, [15, 25]); 

% Determine padding size in x and y dimension 
size_t  = size(t); 
size_a  = size(a); 
outsize  = size_t + size_a - 1; 

% Determine 2D cross correlation in Fourier domain 
Ft = fft2(t, outsize(1), outsize(2)); 
Fa = fft2(a, outsize(1), outsize(2)); 
c = abs(fftshift(ifft2(Fa .* conj(Ft)))); 

% Find peak 
[max_c, imax] = max(abs(c(:))); 
[ypeak, xpeak] = ind2sub(size(c), imax(1)); 

% Correct found peak location for image size 
corr_offset = round([(ypeak-(size(c, 1)+1)/2) (xpeak-(size(c, 2)+1)/2)]); 

% Write out offsets 
y_offset = corr_offset(1) 
x_offset = corr_offset(2) 
+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^