不能在.tiff图像上运行Python代码计算傅里叶变换吗?如何管理记忆?

时间:2013-07-03 20:44:03

标签: python numpy fft

我的Python代码,专为计算傅里叶变换而设计,无法完成任务。

  def fouriertransform(result):     #function for FTM computation
    for filename in glob.iglob('*.tif'):
     imgfourier = scipy.misc.imread(filename, flatten = True)
     image = np.array([imgfourier])#make an array as np
     arr = np.abs(np.fft.fftshift(np.fft.fft2(image)))**2
      with open('сomput.csv', 'wb') as csvfile:
       for elem in arr.flat[:50]:
       writer = csv.writer(csvfile, .....)
       writer.writerow([('{}\t'.format(elem))])

追踪(最近一次呼叫最后一次):

  File "C:\Python27\lib\site-packages\numpy\fft\fftpack.py", line 524, in _raw_fftnd
  a = function(a, n=s[ii], axis=axes[ii])
  File "C:\Python27\lib\site-packages\numpy\fft\fftpack.py", line 164, in fft
  return _raw_fft(a, n, axis, fftpack.cffti, fftpack.cfftf, _fft_cache)
  File "C:\Python27\lib\site-packages\numpy\fft\fftpack.py", line 75, in _raw_fft
  r = work_function(a, wsave)

MemoryError

图像大90 MB,如果以某种方式在1-5 MB图像上工作,如何解决问题?

谢谢

1 个答案:

答案 0 :(得分:1)

一些建议:

  • scipy.fftpack函数允许您选择覆盖输入数组(overwrite_x=True),这可能会为您节省一些内存。

  • 您还可以尝试anfft(或更新的pyFFTW),它只是FFTW C库的Python包装器。它肯定比numpy和scipy FFT函数快得多,至少在我手中它看起来也更节省内存。

  • 您是否可以将数组转换为较低的位深度(float64-> float32,uint16-> uint8)?

  • 您可以随时对图片进行下采样(例如,使用scipy.ndimage.zoom)。降低图像的空间分辨率当然会降低FFT的光谱分辨率,但对你来说可能并不重要,具体取决于你想用它做什么。

  • 购买更多内存?