我正在尝试使用MATLAB使用两种方法使用高斯滤波器对图像进行卷积:使用1D FFT的可分离卷积和使用2D FFT的不可分离卷积。我期待可分离的卷积更快。但是,它不适用于小图像,而是适用于2D较快的较大图像。我不确定这是我的实施是否有问题,或者是因为我没有这个概念。
这是我的代码:
img1 = randi([1,256],128,128);
% Create a Gaassian filter
rf1 = fspecial('gaussian', [1 128], 1.0);
cf1 = transpose(rf1);
gf1 = cf1 * rf1;
rc1 = round(conv2(img1, gf1, 'same'));
rc1 = fft2dconv(img1, gf1);
rc2 = fft1dconv(img1, rf1, cf1);
function o = fft1dconv(img, rowf, colf)
% Zero-Pad
imgsize = size(img);
rsize = size(rowf);
csize = size(colf);
img = padarray(img, [imgsize(1)/2, imgsize(2)/2]);
rowf = padarray(rowf, [2*imgsize(1)-rsize(1), 2*imgsize(2)-rsize(2)], 'post');
colf = padarray(colf, [2*imgsize(1)-csize(1), 2*imgsize(2)-csize(2)], 'post');
% Seperable convolution using 1D FFT
tic;
result = fft(transpose(fft(img))) .* fft(transpose(fft(colf)));
result = result .* fft(transpose(fft(rowf)));
o = transpose(round(real(ifft2(result))));
toc;
% Remove Pad
o = o(imgsize(1)+1:2*imgsize(1),imgsize(2)+1:2*imgsize(2));
end
function o = fft2dconv(img, filter)
%zero-pad
imgsize = size(img);
fsize = size(filter);
img = padarray(img, [imgsize(1)/2, imgsize(2)/2]);
filter = padarray(filter, [2*imgsize(1)-fsize(1), 2*imgsize(2)-fsize(2)], 'post');
% Non-Seperable convolution using 2D FFT
tic;
o = round(real(ifft2(fft2(img) .* fft2(filter))));
toc;
% Remove Pad
o = o(imgsize(1)+1:2*imgsize(1),imgsize(2)+1:2*imgsize(2));
end
时间结果如下:
Elapsed time is 0.003315 seconds.
Elapsed time is 0.004369 seconds.
对于4 x 4图像,可分离方法要快得多,但对于较大的图像。事实并非如此,我不确定为什么。任何帮助将非常感激。
答案 0 :(得分:0)
我建议您profile使用您的代码查看正在发生的事情。它可能是您正在进行的其他一些操作,而不是核心FFT计算本身。
进入MATLAB并输入profile viewer
。完成后,在该窗口中运行命令并完成。一旦完成,它将识别代码的密集部分,您可以从中找出如何优化它。你说可分离的过滤器更快是正确的。