c - 在 C 中实现二维卷积的快速方法

标签 c image filter 2d

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

最佳答案

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

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

关于边界:

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

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

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

关于c - 在 C 中实现二维卷积的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/676709/

相关文章:

java - Hazelcast 的开源替代品?

java - 使用 Image.getInstance 调整 pdf 图像大小

javascript - 图片占据整个页面而不是横幅分隔线

css - 解决 CSS 图像位置命中小屏幕上的文本内容

javascript - 使用 JS 将多选添加到筛选列表

ssl - 如何在带有网络钓鱼过滤器的 SSL 下使用 iframe 摆脱页面上的安全非安全警告?

c - 简单数学函数的基准 : why is Fortran and Julia faster than C

c - 链表错误?在C中

php - 只允许字符串中的某些字符

c - 我假设下面的 C 代码做了一些事情。但它没有按照我的假设工作。请检查我的假设有什么问题?