【问题标题】:MATLAB: fast large-sigma smoothing of 2d imagesMATLAB:二维图像的快速大 sigma 平滑
【发布时间】:2016-12-30 10:28:36
【问题描述】:

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

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

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

也尝试过在 X 和 Y 维度上依次运行高斯平滑,但这比原生 imgaussfilt() 功能花费的时间略长。

不同的平滑方法也可以正常工作,还有其他更快的方法吗? (尝试了 imboxfilt()...只是稍微快一点,但效果不佳)。

提前致谢

【问题讨论】:

  • 您是否尝试过将imfilter 与高斯内核一起使用? imfilter 使用英特尔集成性能原语进行高效过滤。
  • 为什么在处理一张图像时需要“多次”应用这个过滤器?也许你一开始只能使用一次,尺寸合适
  • @rayryeng 我尝试使用高斯内核的 imfilter - 速度非常快,但仍然比 imgaussfilt() 稍慢
  • 也许尝试使用较小的图像进行一些处理?使用金字塔?
  • 缩小图像尺寸会影响您的结果吗?如果您必须使用不同的过滤器设置进行多次通过,即使是很小的尺寸减小也可能会为您提供所需的加速。

标签: matlab image-processing blur gaussian smoothing


【解决方案1】:

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

【讨论】:

  • 通过选择合适的框滤镜大小,您可以近似高斯模糊的效果。建议使用盒式过滤器进行很好的观察。 +1。
【解决方案2】:

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

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多