我正在尝试为学校项目实施高斯模糊。 我需要同时制作CPU和GPU实现来比较性能。
我不太清楚我是否理解高斯模糊是如何工作的。所以我的一个问题是 如果我理解正确的话?
继承我现在所做的事: 我使用维基百科http://en.wikipedia.org/wiki/Gaussian_blur中的等式来计算 过滤器。 对于2d,我拍摄图像中每个像素的RGB并将滤镜应用于它 将像素的RGB和周围像素与相关的滤波器位置相乘。 然后将它们相加为新的像素RGB值。 对于1d,我首先水平地应用过滤器然后应该使用vetically 如果我理解正确的话会得到同样的结果。 这个结果与应用2d滤波器的结果完全相同吗?
我的另一个问题是如何优化算法。 我已经读过快速傅立叶变换适用于高斯模糊。 但我无法弄清楚如何联系它。 有人能给我一个正确方向的暗示吗?
感谢。
答案 0 :(得分:6)
是的,2D高斯内核是separable所以你可以将它作为两个1D内核应用。请注意,您不能“就地”应用这些操作 - 但是您需要至少一个临时缓冲区来存储第一个1D传递的结果。
当你有大型内核时,基于FFT的卷积是一种有用的优化 - 这适用于任何类型的滤波器,而不仅仅是高斯滤波器。 “大”的大小取决于您的体系结构,但您可能不想担心使用基于FFT的方法来处理比49x49内核更小的方法。一般方法是:
请注意,如果您将滤镜应用于多个图像,则只需要填充内核一次FFT。您仍然至少有两个FFT可以执行每个图像(一个正向和一个反向),这就是为什么这种技术只能成为大型内核的计算胜利。