高斯模糊和FFT

4
我正在尝试为学校项目实现高斯模糊。 我需要制作CPU和GPU实现以比较性能。
我不太确定自己是否理解了高斯模糊的工作原理。所以我的一个问题是,我是否已经正确理解了?
这是我现在做的: 我使用维基百科上的方程式http://en.wikipedia.org/wiki/Gaussian_blur来计算滤波器。 对于2D,我取图像中每个像素的RGB,并通过将像素及其周围像素与相关的滤波器位置相乘来将其应用于滤波器。 然后将它们加起来成为新的像素RGB值。 对于1D,我首先水平地应用滤波器,然后垂直地应用滤波器,如果我正确理解的话,这应该给出相同的结果。 这个结果和应用2D滤波器时完全一样吗?
我另一个问题是关于如何优化算法。 我读到快速傅里叶变换适用于高斯模糊。 但我无法想象如何联系起来。 有人能给我指点一下方向吗?
谢谢。
1个回答

10

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

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

  • 对图像进行FFT
  • 对内核进行FFT,填充到与图像相同的大小
  • 在频域中将两者相乘(等效于在空间域中进行卷积)
  • 对结果进行IFFT(反向FFT)

请注意,如果要将相同的滤镜应用于多个图像,则只需对填充的核进行一次FFT。 但是,每个图像仍然至少必须执行两个FFT(一个正向和一个反向),这就是为什么此技术仅在大型内核中具有计算优势的原因。


3
使用快速傅里叶变换进行卷积时,可能需要将图像和卷积核都填充到图像+卷积核的大小,否则在边缘附近可能会出现圆形包裹效应。请注意保持原意,简化表述,不要添加解释和其他信息。 - hotpaw2
你可以通过将采样器寻址模式设置为“镜像”纹理来避免这种情况。 - Mathew Kurian
请注意,在应用FFT之前进行填充,乘法是复数乘法。 - Kaaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接