【问题标题】:Gaussian blur and FFT高斯模糊和 FFT
【发布时间】:2011-12-07 14:03:52
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: image-processing fft blur gaussian


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 通过 FFT 使用快速卷积时,您可能需要将图像和内核都填充到图像+内核的大小,否则您可能会在边缘附近出现圆形环绕伪影.
    • 避免这种情况的一种方法是将采样器寻址模式设置为“镜像”纹理。
    • 请注意,填充是在应用FFT之前完成的,并且乘法是复数乘法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2014-05-25
    • 2018-05-01
    • 2015-11-05
    • 2011-03-22
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多