使用1D FFT与2D FFT的可分卷积

用户名

我正在尝试使用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的图像,可分离的方法要快得多,但是对于较大的图像。事实并非如此,我不确定为什么。任何帮助将非常感激。

雷瑞恩

我建议您分析您的代码以查看发生了什么。您可能正在执行其他一些操作,而不是进行核心FFT计算本身。

进入MATLAB并输入profile viewer完成后,在该窗口中运行命令并完成它。完成后,它将确定您代码的密集部分,您可以从那里找出如何对其进行优化。您说对了,可分离的过滤器更快。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

2D圆形卷积Vs卷积FFT [Matlab / Octave / Python]

来自分类Dev

从MATLAB到Python的2D FFT

来自分类Dev

巨大矩阵的2D FFT

来自分类Dev

2D fft-空虚部

来自分类Dev

Matlab问题中使用FFT的2D反卷积

来自分类Dev

CUDA fft 2d 与 MATLAB fft 在 2d 上的不同结果

来自分类Dev

使用FFT属性查找2D函数的导数

来自分类Dev

Matlab / Octave中的2D与3D FFT

来自分类Dev

绘制图像的2D FFT

来自分类Dev

策略-CUFFT在许多图像上计算2D FFT

来自分类Dev

绘制图像的2D FFT

来自分类Dev

使用MATLAB了解3D数据上的1D FFT

来自分类Dev

如何使用iOS Accelerate框架正确填充FFT的2D数组

来自分类Dev

适用于1D的opencv dft与matlab fft

来自分类Dev

用图像进行FFT 1D的MATLAB重构

来自分类Dev

简单的FFT 1D OpenCL示例结果差

来自分类Dev

为什么在调用1D卷积时TensorFlow计算2D卷积?

来自分类Dev

CUDA库夫库2D FFT仅左半平面正确

来自分类Dev

Python 2D自相关fft-减去均值或否?

来自分类Dev

KISSFFT中2D阵列之间的逐元素乘法结果与SciPy FFT不同

来自分类Dev

将2D矩阵中的多个1D信号与2D矩阵中的多个1D内核进行卷积

来自分类Dev

使用fft进行系统输出的线性卷积

来自分类Dev

使用 FFT 的卷积速度有多快

来自分类Dev

具有可分离内核的2D模糊卷积

来自分类Dev

在Matlab 2D DFT fft2()函数中读出一个点的方向和频率

来自分类Dev

3D阵列的1D实数FFT和IFFT

来自分类Dev

在python中实现基于FFT的2D内核密度估计器,并将其与SciPy实施方式进行比较

来自分类Dev

确定3D内核的可分离性(1D内核能否获得3D卷积的结果?)

来自分类Dev

如何对1d和2d数组强制使用2d形状