Как построить соотношение двух изображений в Matlab - PullRequest
0 голосов
/ 10 апреля 2019

Необходимо построить нелинейную корреляцию между двумя изображениями. На выходе получается резкий пик, когда изображения одинаковы. Если изображения отличаются, мы получаем рассеянный график на поверхности.

Формула для этого соотношения:

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

Требуемый вывод показан на рисунках PIC 1 аналогично и отличается

Графики, описанные Морисом, могут быть построены с использованием xcorr2 () из Matlab. Я строю график для похожего и отличающегося изображения, как показано: PIC 2 xcorr2 plots

Однако я хочу кривую с резкими пиками, как показано на PIC 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 голосов
/ 11 апреля 2019

Кажется, вы забыли сопряженное, т.е.

% 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 содержит используемую формулу и ссылки на соответствующие статьи.

...