我有一个处理大型2d灰度图像集的程序,目前在处理每个图像时多次使用imgaussfilt() (Matlab 2015b)。事实证明,就运行时而言,这是非常昂贵的。我有几个较大的sigma值的实例,它们似乎成本更高(例如imgaussfilt(image,1,40)...imgaussfilt(image,10,15)).
有没有人知道高斯平滑的更快版本/方法?
我尝试过使用FFT/IFFT方法,但这似乎比原生的MATLAB imgaussfilt()特性花费的时间要长得多。
我还尝试了在X和Y维度上连续运行高斯平滑,但这比本机的imgaussfilt()功能花费的时间稍长。
一种不同的平滑方法也可以很好地工作,有没有其他更快的方法?(已尝试使用imboxfilt()...only,速度稍快,但效果不佳)。
提前感谢
发布于 2016-08-24 20:07:48
从你的描述看来,你使用的是高度各向异性的滤波器,这里是1,40或10,15。如果真的是这样,所以你的每个滤波器都不相关,我建议使用积分图像的图像平均。相关的matlab函数是积分图像和积分滤波器。这不是高斯平滑,而是一个箱形滤波器。然而,一旦为输入图像计算,积分图像可以重复用于许多不同的滤波,并且滤波效果的强度与核大小(!)无关,这可能不是imgaussfilter的情况。然而,也许你应该注意图像边框的效果。
发布于 2016-08-24 02:13:37
我能想到的最便宜的平滑方法之一是简单地取相邻像素的平均值:
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);https://stackoverflow.com/questions/39103786
复制相似问题