我使用 FFT 在频域中进行滤波,但是当我使用大内核时,我在边界上发生了偏移,我认为这是由于循环卷积的性质,我需要做更多的零填充。
但是如何计算所需的填充大小?在matlab中应该是2的幂吗?
这是我的matlab代码:
tic
I= rgb2gray(imread('im.jpg'));
h = fspecial('gaussian',555);
F = fft2(double(I));
H = fft2(double(h), size(I,1), size(I,2));
F_fH = H.*F;
ffi = ifft2(F_fH);
toc
figure, imshow(ffi,[])
更新:
这是解决方案:
%The zero-padding is just a way to make cyclical convolutions
%(which is what FFT-based convolutions are) act like linear convolutions.
%the convolution theorem yields the desired linear convolution result only
%if x(n) and h(n) are padded with zeros prior to the DFT such that their
%respective lengths are Nx+Nh-1, essentially zeroing out all circular artifacts.
tic
%Frequency Domain Filtering
I= rgb2gray(imread('im.jpg'));
ker_sz= 55;
h = fspecial('gaussian',ker_sz);
F = fft2(double(I), size(I,1)+ker_sz-1, size(I,2)+ker_sz-1);
H = fft2(double(h), size(I,1)+ker_sz-1, size(I,2)+ker_sz-1);
F_fH = F.*H;
ffi = ifft2(F_fH);
ffi= ffi((ker_sz-1)/2+1:(ker_sz-1)/2+size(I,1), (ker_sz-1)/2+1:(ker_sz-1)/2+size(I,2));
toc
%Display results
figure, imshow(ffi,[])