Кросс-корреляция в частотной и пространственной областях - сопоставление шаблонов
Поэтому, когда я пытаюсь найти шаблон 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, это дает другой результат, хотя и неправильный. Как я могу сделать это правильно?
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)