用于网格图像基本fft的Python代码

时间:2013-03-21 03:44:22

标签: python fft

我正试图在python中拍摄一张图像,改变转换后的图像并采取反向fft。具体来说,我有一个网格的图片,我想要转换,然后除了变换的中心,狭窄的垂直切口以外的所有黑色,然后采取反向fft。

我现在正在使用的代码,无需更改平面:

import os
os.chdir('/Users/terra/Desktop')
import Image, numpy
i = Image.open('grid.png')
i = i.convert('L')    #convert to grayscale
a = numpy.asarray(i)  # a is readonly

b = abs(numpy.fft.rfft2(a))

j = Image.fromarray(b)
j.save('grid2.png')

截至目前,我收到一条错误消息:

追踪(最近一次通话):   文件“/Users/terra/Documents/pic2.py”,第11行,in     j.save( 'grid2.png')   文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL/Image.py”,第1439行,保存     save_handler(self,fp,filename)   在_save中输入文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL/PngImagePlugin.py”,第506行     提高IOError,“无法将模式%s写为PNG”%模式 IOError:无法将模式F写为PNG

我对编程和傅里叶变换都很陌生,所以我在网上发现的大部分相关主题都在我脑海中。非常感谢非常具体的帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

主要问题是数组在FFT之后包含浮点数,但是为了对PNG输出有用,你需要uint8 s。

最简单的方法是直接将其转换为uint8

b = abs(numpy.fft.rfft2(a)).astype(numpy.uint8)

这可能不会产生你想要的图像,因此在将它们转换为整数之前,你必须以某种方式规范化数组中的值。