как построить корреляцию двух изображений в Matlab

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

Формула этой корреляции:

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

Требуемый результат показан на рисунках PIC 1 similar vs dissimilar

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

Однако мне нужна кривая с острыми пиками, как показано на 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))

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


person liwei    schedule 10.04.2019    source источник
comment
Ваше уравнение и ваш код вообще не совпадают. Уравнение использует FT каждого входного изображения три раза, в вашем коде вы используете их только один раз.   -  person Cris Luengo    schedule 11.04.2019
comment
Я знаю, я просто пытался заявить, что я пытался.   -  person liwei    schedule 12.04.2019
comment
Так что же мешает вам реализовать это уравнение? Я не понимаю вашего вопроса. У вас есть уравнение, у вас есть код, который вычисляет часть FT и умножение, вы пробовали экстраполировать это?   -  person Cris Luengo    schedule 12.04.2019


Ответы (1)


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

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

person Maurits    schedule 11.04.2019
comment
Спасибо за ваш ответ. Я пытался использовать ваш код, но график серфинга для обоих случаев (похожие и разные изображения) одинаков. Можете ли вы попробовать вывести, как показано на прикрепленном изображении выше, и помочь мне реализовать код. Я даже попробовал ваш код с фактической формулой, но графики не являются острыми пиками, это больше похоже на перевернутую кривую чаши. - person liwei; 12.04.2019
comment
@liwei Тогда вам нужно поделиться оригинальными изображениями. - person Maurits; 12.04.2019
comment
Пожалуйста, проверьте мой первый пост, я отредактировал два изображения. PIC 1 - это желаемый вывод графика, а PIC 2 - тот, который вы описали, похоже, я могу найти это, используя метод xcorr2() Matlab. - person liwei; 12.04.2019
comment
@Cris Luengo Спасибо за толчок: D Я попробовал приведенный выше код, который я отредактировал в оригинальном посте, но, похоже, он не работает. Можете ли вы проверить, какие изменения нужно внести? - person liwei; 15.04.2019