5

我正在尝试实现一种视觉算法,其中包括一个带有 9x9 拉普拉斯高斯滤波器的预滤波阶段。你能指出一个简要解释快速过滤器实现的文档吗?我认为我应该使用 FFT 进行最有效的过滤。

4

3 回答 3

10

您确定要使用 FFT 吗?那将是一个全数组变换,这将是昂贵的。如果您已经决定使用 9x9 卷积滤波器,则不需要任何 FFT。

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

关于边界:

  • 如果您假设边界外的值为 0,则将 0 的 4 元素边界添加到您的二维点数组中。这将避免需要 `if` 语句来处理昂贵的边界。
  • 如果您的数据在边界处环绕(即它是周期性的),则使用模数或添加一个 4 元素边界,该边界复制网格的另一侧(abcdefg -> fgabcdefgab 为 2 点)。**注意:这是您对任何类型的傅立叶变换隐含的假设,包括 FFT**。如果不是这种情况,您需要在完成任何 FFT 之前对其进行考虑。

4 个点是因为 9x9 内核的最大边界重叠是主网格之外的 4 个点。因此,2n+1 x 2n+1 内核需要 n 个边界点。

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

于 2009-03-24T09:55:20.980 回答
2

这是一个理论链接 http://hebb.mit.edu/courses/9.29/2002/readings/c13-1.pdf

这是 fftw 的链接,这是我过去使用过的一个非常好的 FFT 库(检查许可证以确保它合适)http://www.fftw.org/

您所做的就是对图像和内核(9x9 矩阵)进行 FFT。相乘,然后反向变换。

但是,对于 9x9 矩阵,在实际坐标中可能会更好(只需在图像像素和矩阵上进行双循环)。尝试两种方式!

于 2009-03-24T09:52:32.203 回答
2

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

但是,对于 9x9 内核。在速度方面,您可能看不到太多优势。

于 2009-08-13T00:36:15.520 回答