如何在Matlab中绘制两个图像的相关性

时间:2019-04-10 12:12:14

标签: matlab math image-processing signal-processing

需要绘制两个图像之间的非线性相关性。当图像相同时,输出是一个尖峰。如果图像不同,我们会在表面上看到散布的图。

这种相关性的公式是:

abs ( IFT( {FT(img1) FT(img2)} x       {FT(img1) FT(img2)} / abs(FT(img1) FT(img2)) )  ).^2

所需的输出显示在图片PIC 1 similar vs dissimilar

可以使用Matlab的xcorr2()绘制由Maurits描述的图。我绘制了相似和不同的图像,如图所示:PIC 2 xcorr2 plots

但是我希望曲线具有如图1所示的尖锐峰值

这是我写的代码:

a=imread('pepper.tiff')
b=imread('cameraman.tiff')

Fa=fftshift(fft2(a))
Fb=fftshift(fft2(b))
z= abs (ifft2( (Fa.*Fb)  .* (Fa.*Fb) ./ abs(Fa.*Fb)   )  );
surf(abs(z))

但是我得到了一个疯狂的曲线,并且不喜欢原始图片中的曲线。有人熟悉非线性相关图吗? 谢谢

1 个答案:

答案 0 :(得分:0)

似乎您忘记了共轭,即

% assuming your images are the same size
size_t = size(im_a);
% padding size
outsize = 2*size_t - 1;

%   FFT 
Fa = fft2(im_a, outsize(1), outsize(2));
Fb = fft2(im_b, outsize(1), outsize(2));

% Cross correlation
c = abs( fftshift( ifft2(Fa .* conj(Fb))) );

对于归一化互相关,可以使用normxcorr2。 Matlab帮助页面包含所用的公式以及相关论文的链接。