【问题标题】:Why does the computation of np.fft.fft2 depends on the shape of the image?为什么 np.fft.fft2 的计算取决于图像的形状?
【发布时间】:2019-12-06 15:14:23
【问题描述】:

我正在对各种大小的图像缓冲区以二维方式计算 fft。我注意到对于某些形状,计算时间会突然增加。

我正在使用 python 3.7 和 numpy 1.16.0。我也尝试了 pyfftw 并且问题没有出现在那里。

这是一个代码示例,突出显示我的 numpy 问题:

import numpy as np
import time

fake_image = np.ones((1000,8192))
for i in range(200,700,50):
    crop = fake_image[:,i:]

    start = time.time()
    res_scipak = np.fft.fft2(crop)
    end = time.time()
    print(f"{i}: {end-start}")

我得到以下结果:

200: 0.8815453052520752
250: 0.8947739601135254
300: 16.496759176254272
350: 9.420636177062988
400: 4.677924156188965
450: 1.1415870189666748
500: 4.911479711532593
550: 29.64967179298401
600: 1.1793103218078613
650: 3.6275839805603027

我实际上希望在列数减少时看到计算时间减少。

【问题讨论】:

    标签: numpy image-processing fft


    【解决方案1】:

    fft 在考虑到小素数的大小上效果最好。考虑到这一点,将您的观察结果与:

    import sympy
    
    for i in range(200,700,50):
        print(i,sympy.primefactors(8192-i))
    
    200 [2, 3, 37]
    250 [2, 11, 19]
    300 [2, 1973]
    350 [2, 3, 1307]
    400 [2, 487]
    450 [2, 7, 79]
    500 [2, 3, 641]
    550 [2, 3821]
    600 [2, 13, 73]
    650 [2, 3, 419]
    

    为什么它不适用于 pyfftw?有一些方法可以处理大素数,例如https://en.wikipedia.org/wiki/Rader%27s_FFT_algorithm,它似乎是what fftw uses

    【讨论】:

      猜你喜欢
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 2019-10-12
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2020-02-28
      相关资源
      最近更新 更多