Python中最快的2D卷积或图像过滤器

发布于 2021-01-29 15:06:34

几个用户询问在numpy的或SciPy的[图像卷积的速度或存储器消耗1234 ]。从回答和我使用Numpy的经验来看,与Matlab或IDL相比,我认为这可能是numpy的主要缺点。

到目前为止,没有一个答案能解决整个问题,所以这里是:“用Python计算2D卷积最快的方法是什么?”
常见的python模块是公平的游戏:numpy,scipy和PIL(其他?)。为了比较具有挑战性,我想提出以下规则:

  1. 输入矩阵分别为2048x2048和32x32。
  2. 单精度或双精度浮点都可以接受。
  3. 将输入矩阵转换为适当格式所花费的时间不算在内-仅是卷积步骤。
  4. 用输出替换输入矩阵是可以接受的(任何python库都支持吗?)
  5. 可以直接对常见C库进行DLL调用-lapack或scalapack
  6. PyCUDA就可以了。使用自定义GPU硬件是不公平的。
关注者
0
被浏览
79
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这实际上取决于您要执行的操作…很多时候,您不需要完全通用的(阅读:更慢)的2D卷积…(即,如果滤波器是可分离的,则可以使用两个1D卷积来代替…这就是为什么各种scipy.ndimage.gaussian,,scipy.ndimage.uniform比实现为通用nD卷积的同一事物要快得多的原因。)

    无论如何,作为比较点:

    t = timeit.timeit(stmt='ndimage.convolve(x, y, output=x)', number=1,
    setup="""
    import numpy as np
    from scipy import ndimage
    x = np.random.random((2048, 2048)).astype(np.float32)
    y = np.random.random((32, 32)).astype(np.float32)
    """)
    print t
    

    这在我的机器上花费6.9秒…

    比较一下 fftconvolve

    t = timeit.timeit(stmt="signal.fftconvolve(x, y, mode='same')", number=1,
    setup="""
    import numpy as np
    from scipy import signal
    x = np.random.random((2048, 2048)).astype(np.float32)
    y = np.random.random((32, 32)).astype(np.float32)
    """)
    print t
    

    这大约需要10.8秒。但是,在输入大小不同的情况下,使用fft进行卷积可能会更快(尽管目前看来我似乎还没有一个很好的例子……)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看