English 中文(简体)
在C中实现2D卷积的快速方法
原标题:
  • 时间:2009-03-24 09:46:22
  •  标签:

我正在尝试实现一个视觉算法,其中包括使用9x9拉普拉斯-高斯滤波器的预过滤阶段。您可以指出一个简要说明快速滤波实现的文档吗?我认为我应该利用FFT进行最高效的滤波。

最佳回答

你确定要使用FFT吗?那会是一个整个数组的变换,非常费时。如果你已经决定使用9x9卷积滤波器,就不需要使用FFT了。

通常,在C中进行卷积的最便宜的方法是设置一个循环,移动指针覆盖数组,在每个点上加总卷积值,并将数据写入新数组。然后可以使用您喜欢的方法(编译器矢量化、MPI库、OpenMP等)并行化该循环。

关于边界:

  • If you assume the values to be 0 outside the boundaries, then add a 4 element border of 0 to your 2d array of points. This will avoid the need for `if` statements to handle the boundaries, which are expensive.
  • If your data wraps at the boundaries (ie it is periodic), then use a modulo or add a 4 element border which copies the opposite side of the grid (abcdefg -> fgabcdefgab for 2 points). **Note: this is what you are implicitly assuming with any kind of Fourier transform, including FFT**. If that is not the case, you would need to account for it before any FFT is done.

这4个点是因为9x9内核的最大边界重叠超出主格4个点。因此,对于2n + 1 x 2n + 1内核,需要n个边界点。

如果您需要这个卷积计算非常快,并且/或者您的网格很大,请考虑将其分成较小的部分,可以保存在处理器缓存中,因此可以更快地计算。这也适用于您可能想要进行的任何GPU卸载(它们非常适合这种类型的浮点计算)。

问题回答

Here is a theory link http://hebb.mit.edu/courses/9.29/2002/readings/c13-1.pdf

这是fftw的链接,它是我以前使用过的一个相当不错的FFT库(请检查许可证,以确保它是合适的)。 http://www.fftw.org/

你所要做的就是对你的图像和卷积核(9x9矩阵)进行FFT变换,然后将它们相乘,再进行反向变换。

然而,使用9x9矩阵,您仍然最好使用实际坐标(只需通过图像像素和矩阵的双循环即可)。尝试两种方法!

实际上,您不需要使用足够大的FFT尺寸来容纳整个图像。您可以执行许多较小的重叠2d fft。您可以搜索“快速卷积”“重叠保存”“重叠添加”。

然而,对于9x9内核。您可能不会在速度方面看到太大的优势。





相关问题
热门标签