当前位置: 首页 > 知识库问答 >
问题:

用FFT实现二维卷积

凌修伟
2023-03-14

tensorflow.conv2d()对于用大内核(筛选器)卷积大图像来说速度慢得不切实际。将一个1024x1024的图像与一个相同大小的内核进行卷积需要几分钟的时间。为了进行比较,cv2.filter2d()立即返回结果。

我找到了tf.fft2()tf.rfft()

然而,我并不清楚如何使用这些函数执行简单的图像过滤。

如何使用FFT与TensorFlow实现快速二维图像滤波?

共有1个答案

端木兴国
2023-03-14

使用卷积定理和离散时间傅里叶变换(DTFT)可以计算形式为x*y的线性离散卷积。如果x*y是循环离散卷积,则可以用离散傅里叶变换(DFT)计算。

卷积定理状态x*y可以使用傅里叶变换计算为

如果xy是离散的,并且它们的卷积是循环卷积,则上面的DTFT由DFT代替。注意:线性卷积问题可以嵌入到循环卷积问题中。

我对MATLAB比较熟悉,但是通过阅读TensorFlow的TF.Signal.FFT2DTF.Signal.IFFT2D文档,下面的解决方案可以通过替换MATLAB函数FFT2IFFT2轻松转换为TensorFlow。

在MATLAB(和TensorFlow)中FFT2(和TF.Signal.FFT2D)使用快速傅里叶变换算法计算DFT。如果xy的卷积是循环的,则可以通过下式计算

ifft2(fft2(x).*fft2(y))

其中.*表示MATLAB中逐元素乘法。然而,如果它是线性的,那么我们将数据零填充到长度2n-1,其中n是一维的长度(在问题中为1024)。在MATLAB中,这可以有两种计算方法之一。首先,由

h = ifft2(fft2(x, 2*N-1, 2*N-1).*fft2(y, 2*N-1, 2*N-1));

其中MATLAB通过补零计算xy2*n-1点二维傅里叶变换,然后进行2*n-1点二维傅里叶逆变换。这个方法不能在TensorFlow中使用(根据我对文档的理解),所以next是唯一的选择。在MATLAB和TensorFlow中,首先将xy扩展为大小2*n-1x2*n-1,然后计算2*n-1点二维傅里叶变换和逆傅里叶变换,即可计算卷积

x_extended = x;
x_extended(2*N-1, 2*N-1) = 0;

y_extended = y;
y_extended(2*N-1, 2*N-1) = 0;

h_extended = ifft2(fft2(x_extended).*fft2(y_extended));

在MATLAB中,hh_extended完全相等。在不进行傅里叶变换的情况下,可以计算xy的卷积

hC = conv2(x, y);

在MATLAB中。

 类似资料:
  • 卷积神经网络(convolutional neural network)是含有卷积层(convolutional layer)的神经网络。本章中介绍的卷积神经网络均使用最常见的二维卷积层。它有高和宽两个空间维度,常用来处理图像数据。本节中,我们将介绍简单形式的二维卷积层的工作原理。 二维互相关运算 虽然卷积层得名于卷积(convolution)运算,但我们通常在卷积层中使用更加直观的互相关(cro

  • 有没有人知道关于Mayer FFT实现的任何事情(而不需要我花很多时间研究代码)? 我正在尝试执行一个卷积,而ifft似乎产生了我所谓的“镜像”输出。换句话说,我的内核+信号长度被限制为N/2,并且任何占据N=0....N/2的内容都被镜像到N=N...N/2左右。在负频率下,它看起来有点像我所期望的FFT...除了在负时间下,它就像一面镜子。 下面是我的卷积代码: 我曾经尝试用这个mayer F

  • 我如何用CUDA在一个相对较大的图像和一个非常小的内核(3x3)之间执行快速的2D卷积?

  • 问题内容: scipy(或另一个流行的库)中是否内置了基于FFT的2D互相关或卷积函数? 有如下功能: -“大数据执行的直接方法将很慢” -“使用精确计算(即不使用FFT)将数组与给定内核相关联。” ,我不太了解,但似乎有误 numarray有一个带switch的函数,但是我想numarray被折叠成numpy了,我找不到是否包含此函数。 问题答案: 我发现,因为还马格努斯指出,但它的时候并没有意

  • 在我的项目中,我编写了一个简单的直接3D卷积C实现,在输入上使用周期性填充。不幸的是,由于我是C新手,所以性能不太好。。。代码如下: 按照惯例,所有矩阵(图像、内核、结果)都以列为主的方式存储,这就是为什么我以这种方式循环遍历它们,以便它们在内存中更近(听说这会有所帮助)。 我知道这个实现非常天真,但由于它是用C编写的,我希望性能会很好,但结果有点令人失望。我用大小为100^3的图像和大小为10^

  • 本文向大家介绍使用jquery.qrcode.min.js实现中文转化二维码,包括了使用jquery.qrcode.min.js实现中文转化二维码的使用技巧和注意事项,需要的朋友参考一下 今天还是要讲一下关于二维码的知识,前几篇讲解中有讲到我使用的可以生成二维码的js是qrcode.js,然后结合Cordovad的插件$cordovaBarcodeScanner插件可以扫描二维码,这样就基本完成了