如何实现梯度高斯模糊?

时间:2014-03-16 11:54:00

标签: c++ image image-processing

伙计们,我想实现渐变高斯模糊效果。通过 gradient ,我的意思与Photoshop相同。以下图为例:

Gradient Gaussian Blur image http://www.photokaboom.com/images/Photoshop_Elements/dof/blur_the_background_with_gradient/bleachers_blurred.jpg

随着y坐标的增加,图像的模糊度会降低(将左上角点作为原点)。

我知道如何使用内核和FFT来实现正常的高斯模糊,但我不知道如何通过更改y坐标来改变模糊度。我试图将图像分成不同的线(在y轴方向上)并对这些块应用不同的内核,但是这些线的连接部分的效果非常烦人。

我也尝试过逐个计算结果像素,并在运行时填充内核,效果相当不错,但算法太慢了!!

所以我想知道如何实现快速梯度高斯模糊算法?

非常感谢!

1 个答案:

答案 0 :(得分:1)

模糊是2D操作,并且难以在每行中以不同的模糊程度逐行处理。在考虑高斯模糊之前,我建议探索一种视觉上难以与高斯模糊区分开来的盒子模糊解决方案。

一种方法是使用Integral image。自己创建它是一个很好的练习,它非常简单:整体图像的大小与原始图像相同。内容是当前像素上方和左侧的所有像素强度的总和(我们分别讨论每个rgb通道)。构建积分图像的简单迭代方法是使用以下公式:

I(x,y)= Gray(x, y) + I(x-1, y) + I(x, y-1) - I(x-1, y-1) 

提示:如果您首先计算一个时间数组,您可以更快地完成它,其中每个元素只是将同一行中左侧的强度相加。

积分图像的优点在于它们允许在恒定时间内在任意大小的窗口中计算总和。实际上,这只需要4个操作:对于x1,y1,x2,y2的窗口和积分图像I(x,y)

sum(x1, y1, x2, y2) = I(x2, y2)+I(x1, y1)-I(x1, y2)-I(x2, y1)

因此,您可以实现快速模糊框滤镜(您不会在视觉上看到框和高斯滤镜效果之间的差异)

Iblur(x, y, sz) = I(x+sz, y+sz)+I(x, y)-I(x+sz, y)-I(x, y+sz)/[sz*sz]

现在您需要做的就是将快速模糊操作应用于所有像素的变化sz作为y的函数。它只需要4 * w * h的操作;构建积分图像也是O(h * w),因此您实际上可以在线性时间内完成。分别为每个通道执行此操作并将它们组合在一个新的rgb中。

最后,积分图像计算是Haar盒式滤波器(而不是小波或Gabor)的基础,用于快速检测面部或物体,跟踪等。它们的速度是允许现在实时查找面部因此它们值得的学习。