2011-10-14 142 views
2

我试图为学校项目实施高斯模糊。 我需要让CPU和GPU实现来比较性能。高斯模糊和FFT

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

继承人我现在所做的: 我使用维基百科的公式http://en.wikipedia.org/wiki/Gaussian_blur来计算 该过滤器。 对于第2d我采取图像中的每个像素的RGB,并通过 乘以该像素的RGB和周围像素与相关的过滤器位置应用该过滤器。 然后将它们相加成为新的像素RGB值。 对于1d,我首先水平应用滤波器,然后进行滤波,如果我理解正确,应该给出 相同的结果。 此结果与应用2d过滤器时的结果完全相同吗?

我的另一个问题是关于如何优化算法。 我读过快速傅立叶变换适用于高斯模糊。 但我无法弄清楚如何与它联系。 有人能给我一个正确的方向提示吗?

谢谢。

回答

5

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

当你有大的内核时,基于FFT的卷积是一种有用的优化 - 这适用于任何类型的滤波器,而不仅仅是高斯。 “大”的大小取决于您的体系结构,但您可能不希望对比任何比49x49内核更小的内容使用基于FFT的方法。一般的方法是:

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

请注意,如果您将滤波器应用于多个图像,则只需填充一次填充的内核即可。尽管(一个正向和一个反向),你仍然有至少两个FFT执行每个图像,这就是为什么这种技术只能成为大内核内核的计算胜利的原因。

+2

当通过FFT使用快速卷积时,您可能需要将图像和内核填充到图像+内核的大小,否则最终可能会在边缘附近出现圆形环绕瑕疵。 – hotpaw2

+0

可以避免的一种方法是将采样器寻址模式设置为“镜像”纹理。 – bluejamesbond