FFT与数组到图像/图像到数组的转换

3 投票
1 回答
8798 浏览
提问于 2025-04-15 21:41

我想对一张图片进行傅里叶变换。
但是我该怎么把图片转换成数组呢?
然后我想我应该使用numpy.fft.rfft2来进行变换。
最后,怎么把数组再转换回图片呢?
提前谢谢你。

1 个回答

12

你可以使用PIL这个库来加载和保存图片,还可以把图片转换成numpy数组,或者把numpy数组转换成图片。

import Image, numpy
i = Image.open('img.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('img2.png')

我在上面用了abs这个函数,因为FFT的结果是复数值,直接把它转换成图片是没有意义的。我们把它转换成灰度图,是为了让FFT只在一个通道上进行处理——你也可以选择其他方式来选取通道,或者把正确的axes参数传给rfft2,然后再提取你需要的通道。

编辑:

如果你想进行反向FFT,得到原始图片,下面的代码对我有效:

import Image, numpy
i = Image.open('img.png')
i = i.convert('L')    #convert to grayscale
a = numpy.asarray(i)

b = numpy.fft.rfft2(a)
c = numpy.fft.irfft2(b)

j = Image.fromarray(c.astype(numpy.uint8))
j.save('img2.png')

撰写回答