MATLAB:2d图像的快速大西格玛平滑

时间:2016-08-23 14:19:01

标签: matlab image-processing blur gaussian smoothing

我有一个处理大量2d灰度图像的程序,目前在处理每个图像时多次使用imgaussfilt()(Matlab 2015b)。就运行时而言,这被证明是非常昂贵的。我有一些较大的sigma值的例子似乎更昂贵(即imgaussfilt(图像,[1,40])... imgaussfilt(image,[10,15]))。

有谁知道高斯平滑的更快版本/方法?

我尝试过使用FFT / IFFT方法,但这似乎比原生MATLAB imgaussfilt()功能要长得多。

还尝试在X和Y维度上连续运行高斯平滑,但这比原生的imgaussfilt()功能稍长。

不同的平滑方法也可以正常工作,有没有其他方法快得多? (尝试过imboxfilt()......只是稍微快一点而且不太好。)

提前致谢

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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);