Clear Filters
Clear Filters

Cross-correlation in frequency domain and xcorr2 in MATLAB

4 views (last 30 days)
What are the reasons for the differences between my frequency domain cross-correlation results and those obtained using the xcorr2() function in MATLAB? Is it possible that xcorr2() performs spatial domain cross-correlation, and how might this affect the results?
img1 = imread('1.jpg');
img2 = imread('2.jpg');
img1_gray = rgb2gray(img1);
img2_gray = rgb2gray(img2);
[m, n] = size(img1_gray);
[p, q] = size(img2_gray);
fft_img1 = fft2(img1_gray, m + p - 1, n + q - 1);
fft_img2 = fft2(img2_gray, m + p - 1, n + q - 1);
cross_correlation = (fft_img1 .* conj(fft_img2));
cross_correlation = ifft2(cross_correlation);
cross_correlation = fftshift(cross_correlation);
cross_correlation_xcorr2 = xcorr2(img2_gray, img1_gray);
figure;
subplot(2, 1, 1);
imshow(cross_correlation, []);
title('Custom Cross-Correlation');
subplot(2, 1, 2);
imshow(cross_correlation_xcorr2, []);
title('xcorr2');
Results:

Accepted Answer

Paul
Paul on 11 May 2024
Hi Shy,
Assuming that the output of the xcorr2 is the expected result, it can be obtained with the changes below
img1 = imread('1.jpg');
img2 = imread('2.jpg');
img1_gray = rgb2gray(img1);
img2_gray = rgb2gray(img2);
[m, n] = size(img1_gray);
[p, q] = size(img2_gray);
%fft_img1 = fft2(img1_gray, m + p - 1, n + q - 1);
fft_img1 = fft2(flipud(fliplr(img1_gray)), m + p - 1, n + q - 1);
fft_img2 = fft2(img2_gray, m + p - 1, n + q - 1);
%cross_correlation = (fft_img1 .* conj(fft_img2));
cross_correlation = (fft_img1 .* fft_img2);
cross_correlation = ifft2(cross_correlation);
%cross_correlation = fftshift(cross_correlation);
cross_correlation_xcorr2 = xcorr2(img2_gray, img1_gray);
figure;
subplot(2, 1, 1);
imshow(cross_correlation, []);
title('Custom Cross-Correlation');
subplot(2, 1, 2);
imshow(cross_correlation_xcorr2, []);
title('xcorr2');
  3 Comments
Paul
Paul on 11 May 2024
As I undersand it, xcorr2(x,y) is the the same as conv2 of x and the 2D-reversed conjugate of y. But in this case, img1_gray is real, so its conjugate is itself. With that understanding, I just made the fft stuff implement the convolution of img2 and the 2D-reverse of img1 (because img1 is the second argument to xcorr2).

Sign in to comment.

More Answers (0)

Products


Release

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!