网格图像的基本FFT的Python代码
我正在尝试在Python中对一张图片进行快速傅里叶变换(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 行,在 j.save('grid2.png') 文件 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL/Image.py",第 1439 行,在 save save_handler(self, fp, filename) 文件 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PIL/PngImagePlugin.py",第 506 行,在 _save raise IOError, "无法将模式 %s 写入 PNG" % mode IOError: 无法将模式 F 写入 PNG
我对编程和傅里叶变换非常陌生,所以我在网上找到的大多数相关讨论我都看不懂。非常感谢任何具体的帮助。谢谢!
1 个回答
主要的问题是,经过快速傅里叶变换(FFT)后,数组里包含的是浮点数,但如果想把它用来生成PNG格式的图片,就需要把这些数转换成uint8
类型。
最简单的方法就是直接把它转换成uint8
:
b = abs(numpy.fft.rfft2(a)).astype(numpy.uint8)
不过这样做可能不会得到你想要的图像,所以在把这些数转换成整数之前,你需要先对数组里的值进行归一化处理。