我的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图像上工作,如何解决问题?
谢谢
答案 0 :(得分:1)
一些建议:
scipy.fftpack
函数允许您选择覆盖输入数组(overwrite_x=True
),这可能会为您节省一些内存。
您还可以尝试anfft
(或更新的pyFFTW),它只是FFTW C库的Python包装器。它肯定比numpy和scipy FFT函数快得多,至少在我手中它看起来也更节省内存。
您是否可以将数组转换为较低的位深度(float64-> float32,uint16-> uint8)?
您可以随时对图片进行下采样(例如,使用scipy.ndimage.zoom
)。降低图像的空间分辨率当然会降低FFT的光谱分辨率,但对你来说可能并不重要,具体取决于你想用它做什么。
购买更多内存?