2016-08-23 44 views
1

我有一个处理大量2d灰度图像的程序,并且在处理每个图像(Matlab 2015b)时,目前多次使用imgaussfilt()。就运行时间而言,这证明是非常昂贵的。我有几个较大的西格马值的例子,它似乎更昂贵(即imgaussfilt(image,[1,40])... imgaussfilt(image,[10,15]))。MATLAB:二维图像的快速大西格玛平滑

有没有人知道任何更快的版本/方法高斯平滑?

我已经尝试过使用FFT/IFFT方法,但是这似乎需要比原生MATLAB imgaussfilt()功能更长的时间。

也尝试了先后在X和Y维上运行高斯平滑,但这需要比本地imgaussfilt()功能稍长一些。

不同的平滑方法也可以很好地工作,还有其他方法是否快得多? (尝试imboxfilt()...只稍快,不如)。

在此先感谢

+0

你有没有试过用高斯内核的'imfilter'? 'imfilter'使用英特尔集成性能基元进行高效过滤。 – rayryeng

+0

为什么需要在处理一幅图像时多次应用此滤镜?也许你可以在一开始就使用它只有一次适当的大小 –

+0

@rayryeng我试着imfilter与高斯内核 - 是相当快,但仍然比imgaussfilt() – user3470496

回答

0

一个最便宜的平滑方法,我能想到的是,简单地相邻像素的平均值:

A(i,j) = (A(i-1,j) + A(i+1,j) + A(i,j-1) + A(i,j+1) + w*A(i,j))/(4+w); 

其中w=4是您所选择的一些加权因子。您可以在阵列circshift转移:

A(i-1,j) = circshift(A(i,j), [1 0]); 

等假设您存储图像的所有N阵列中的A(x,y,N),完整Matlab的命令是:

A = (w*A + circshift(A, [-1 0 0]) + circshift(A, [1 0 0]) + circshift(A, [0 -1 0]) + circshift(A, [0 1 0]))/(4+w); 
1

从你的描述看来,你正在使用高度各向异性的过滤器,在这里[1,40]或[10,15]。如果情况确实如此,那么您的每个过滤器都与另一个过滤器无关,我建议使用积分图像进行图像平均。相关的matlab函数是integralimage和integralfilter。这不是高斯平滑,而是盒式过滤器。但是,一旦对输入图像进行计算,积分图像可以重复用于许多不同的滤波,并且滤波效果的强度与内核大小(!)无关,这可能不是imgaussfilter的情况。但是,也许你应该注意图像边界的效果。

+0

通过选择框筛选器的正确大小,可以近似高斯模糊的效果。建议使用盒式过滤器的漂亮观察。 +1。 – rayryeng