首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与MATLAB的imgaussfilt相比,二维高斯滤波与图像滤波有如此大的速度差异?

与MATLAB的imgaussfilt相比,二维高斯滤波与图像滤波有如此大的速度差异?
EN

Stack Overflow用户
提问于 2022-05-10 10:31:07
回答 2查看 261关注 0票数 3

我正在寻求将工作流从MATLAB迁移到Python。我将做大量的大图像过滤,并立即遇到一个性能障碍。在MATLAB R2022a中,用10西格玛高斯滤波器对11587乘13744进行滤波需要少于2秒的时间:

代码语言:javascript
运行
复制
tic, imgf=imgaussfilt(im,10); toc
Elapsed time is 1.792801 seconds.

我在scipy 1.8.0和skimage 0.19.1中尝试了同样的方法,两者都要慢得多:

代码语言:javascript
运行
复制
%timeit scipy.ndimage.gaussian_filter(im, 10, truncate=2)
4.89 s ± 15.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

慢2.7倍。

代码语言:javascript
运行
复制
%timeit skimage.filters.gaussian(im, sigma=10, preserve_range=True, truncate=2)
5.99 s ± 14.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

慢3.4倍。

请注意,truncate设置为2,据我所知,这与MATLAB所做的工作相匹配。我已经验证了输出图像看起来是一样的,所以没有什么基本的错误。

在Python中是否有专门的加速此操作(和类似的图像处理任务)的解决方案?有些库被认为比其他库更快吗?例如,上面我已经看到scipy更快了。

编辑

  • opencv比上述两种方法都快,但仍然比
  • 慢1.4倍左右。然而,这正进入一个有用的领域。opencv是多线程的,这似乎解释了difference.
  • dip (见下文)比MATLAB更快。dip.Gauss(img,10,truncation=2)在一秒钟内执行。
  • 甚至更好,我发现我的图像不一定是16位,opencv能够在600 ms内过滤我的8位图像!奇怪的是,MATLAB需要13秒的时间来过滤这样的图像。所以我想我们这里有赢家了。--
EN

回答 2

Stack Overflow用户

发布于 2022-05-20 05:37:53

根据数据的维数,MATLAB的imgaussfilt选择了空间域处理还是傅立叶域处理。

在某些情况下,它的选择可能会创建优化计算,从而解释您所看到的收益。

如果您想要使用高斯滤波器进行最快的空间滤波,那么您可能应该使用Intel IPP。

票数 1
EN

Stack Overflow用户

发布于 2022-05-11 09:53:07

总之:我为用例找到的最佳解决方案是将16位转换为8位并使用opencv。如果我不想移动到16位的话,DIPlib会更快。一些Python包性能较慢的主要原因似乎是与MATLAB的函数相比,它们不是多线程的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72184717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档