Ben*_*Uri 3 python fft image-processing tensorflow
TensorFlow.conv2d()对于将大图像与大内核(滤波器)进行卷积来说,速度慢得不切实际。将 1024x1024 图像与相同大小的内核进行卷积需要几分钟。为了进行比较,cv2.filter2D()立即返回结果。
我发现tf.fft2()和tf.rfft()。
然而,我不清楚如何使用这些函数执行简单的图像过滤。
如何使用 FFT 通过 TensorFlow 实现快速 2D 图像过滤?
x * y可以使用卷积定理和离散时间傅里叶变换(DTFT)来计算该形式的线性离散卷积。如果x * y是循环离散卷积,则可以使用离散傅里叶变换(DFT)来计算。
卷积定理状态x * y可以使用傅立叶变换计算为
在哪里
表示傅里叶变换并且
傅里叶逆变换。当x和y是离散的并且它们的卷积是线性卷积时,这是使用 DTFT 计算的:
如果x和y是离散的并且它们的卷积是循环卷积,则上面的 DTFT 被 DFT 代替。注意:线性卷积问题可以嵌入到循环卷积问题中。
我对 MATLAB 更熟悉,但通过阅读 TensorFlow 文档tf.signal.fft2d,tf.signal.ifft2d下面的解决方案应该可以通过替换 MATLAB 函数fft2和ifft2.
在 MATLAB(和 TensorFlow)中fft2(和tf.signal.fft2d)使用快速傅立叶变换算法计算 DFT。x如果和的卷积y是循环的,则可以通过以下方式计算
ifft2(fft2(x).*fft2(y))
Run Code Online (Sandbox Code Playgroud)
其中.*表示 MATLAB 中的逐个元素乘法。然而,如果它是线性的,那么我们将数据零填充到长度2N-1,其中N是一维的长度(问题中的 1024)。在 MATLAB 中,可以通过两种方式之一进行计算。首先,通过
h = ifft2(fft2(x, 2*N-1, 2*N-1).*fft2(y, 2*N-1, 2*N-1));
Run Code Online (Sandbox Code Playgroud)
其中 MATLAB通过补零计算和 的2*N-1- 点二维傅里叶变换,然后计算- 点二维傅里叶逆变换。此方法不能在 TensorFlow 中使用(根据我对文档的理解),因此下一个是唯一的选择。在 MATLAB 和 TensorFlow 中,可以通过首先将和扩展到大小x ,然后计算-point 2D 傅里叶变换和傅里叶逆变换来计算卷积xy2*N-1xy2*N-12*N-12*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));
Run Code Online (Sandbox Code Playgroud)
在 MATLAB 中,h和h_extended完全相等。x和的卷积y无需傅里叶变换即可计算:
hC = conv2(x, y);
Run Code Online (Sandbox Code Playgroud)
在 MATLAB 中。
在我的笔记本电脑上的 MATLAB 中conv2(x, y)需要 55 秒,而傅立叶变换方法只需不到 0.4 秒。