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

Я хотел бы взять два изображения и свернуть их вместе в Matlab, используя 2D FFT без обращения к

1 ответов


без заполнения результат будет эквивалентен круговой свертки как вы отмечаете. Для линейной свертки, в свертывая 2 изображениях (2D сигналах) A*B полный выход будет размера Ma+Mb-1 x Na+Nb-1, где Ma x Na, Mb x Nb размеры изображений A и B соответственно.

после заполнения до ожидаемого размера, умножения и преобразования обратно, через ifft2, вы можете сохранить центральную часть полученного изображения (обычно соответствующую самой большой из A и B).

A = double(imread('cameraman.tif'))./255; % image
B = fspecial('gaussian', [15 15], 2); % some 2D filter function

[m,n] = size(A);
[mb,nb] = size(B); 
% output size 
mm = m + mb - 1;
nn = n + nb - 1;

% pad, multiply and transform back
C = ifft2(fft2(A,mm,nn).* fft2(B,mm,nn));

% padding constants (for output of size == size(A))
padC_m = ceil((mb-1)./2);
padC_n = ceil((nb-1)./2);

% frequency-domain convolution result
D = C(padC_m+1:m+padC_m, padC_n+1:n+padC_n); 
figure; imshow(D,[]);

теперь сравните вышеизложенное с выполнением свертки пространственного домена, используя conv2D

 % space-domain convolution result
 F = conv2(A,B,'same');
 figure; imshow(F,[]);

результаты визуально одинаковы, и общая ошибка между ними (из-за округления) на порядок e-10.