FFT和数组到图像/图像到数组转换

3

我想对一幅图像进行傅里叶变换。 但是如何将图片转换为数组呢? 然后我认为我应该使用numpy.fft.rfft2进行变换。 那么如何将数组转换回图像呢? 谢谢提前。

1个回答

12
你可以使用PIL 库来加载/保存图像并将其转换为/从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')

当我进行逆FFT时,我没有得到真实的图像。为什么? - kame
2
@kame 因为对“abs”的调用会丢失数据。此外,源图像应为灰度图像,否则您将获得一个三维数组而不是二维数组。 - interjay
@kame:我添加了代码以展示如何执行逆FFT。我猜这就是你需要的。 - interjay
非常感谢。这不是很明显。 :) - kame
类型错误:无法处理此数据类型。 - Cerin
@Cerin:我猜你没有像第二个例子中那样将图像转换为灰度。对于一个3通道的图像进行FFT并将结果转换为图像并没有什么意义。我也会在第一个例子中添加这个。下次试着问一下,而不是立即点踩。 - interjay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接