4

我正在尝试为学校项目实施高斯模糊。我需要同时实现 CPU 和 GPU 来比较性能。

我不太确定我是否了解高斯模糊的工作原理。所以我的一个问题是我是否理解正确?

这是我现在所做的:我使用来自维基百科http://en.wikipedia.org/wiki/Gaussian_blur的公式来计算过滤器。对于 2d,我获取图像中每个像素的 RGB,并通过将像素和周围像素的 RGB 乘以相关的过滤器位置来对其应用过滤器。然后将这些相加为新的像素 RGB 值。对于 1d,我首先水平应用过滤器,然后垂直应用过滤器,如果我理解正确,应该会给出相同的结果。这个结果是否与应用 2d 过滤器时的结果完全相同?

我的另一个问题是如何优化算法。我读过快速傅里叶变换适用于高斯模糊。但我不知道如何关联它。有人可以给我一个正确方向的提示吗?

谢谢。

4

1 回答 1

8

是的,2D 高斯内核是可分离的,因此您可以将其作为两个 1D 内核应用。请注意,您不能“就地”应用这些操作 - 您至少需要一个临时缓冲区来存储第一个 1D 通道的结果。

当你有大内核时,基于 FFT 的卷积是一种有用的优化 - 这适用于任何类型的滤波器,而不仅仅是高斯滤波器。“大”有多大取决于您的架构,但您可能不想担心使用基于 FFT 的方法来处理小于 49x49 内核的任何内容。一般的做法是:

  • FFT图像
  • FFT内核,填充到图像的大小
  • 在频域中将两者相乘(相当于空间域中的卷积)
  • IFFT(逆FFT)结果

请注意,如果您对多个图像应用相同的过滤器,那么您只需对填充内核进行一次 FFT。不过,每个图像仍然至少需要执行两个 FFT(一个正向和一个反向),这就是为什么这种技术只会成为大型内核的计算胜利。

于 2011-10-14T09:02:45.410 回答