灰度图像转换为NumPy数组以进行傅里叶变换

8

目前我正在使用PIL和NumPy。我有一张彩色的png图片,我想要:

  1. 将它读取成灰度图像
  2. 转换为NumPy数组
  3. 对数组执行FFT
  4. 显示图像

这是我尝试的代码(在带有--pylab标志的IPython中):

In [1]: import Image

In [2]: img = Image.open('ping.png').convert('LA')

In [3]: img_as_np = np.asarray(img)

In [4]: img_as_np
Out[4]: array(<Image.Image image mode=LA size=1000x1000 at 0x105802950>, dtype=object)

In [5]: img_fft = fft.fft2(img_as_np) // IndexError: index out of range for array

使用“LA”模式(灰度与透明度)的原因是什么? - mmgp
1
在重新考虑之后,https://dev59.com/nmYq5IYBdhLWcg3weQgy#14472089 上的答案展示了如何正确显示傅里叶变换结果。 - mmgp
我在某处读到,LA 模式可以让我在灰度模式下使用 imshow()。现在我意识到 L 也可以将其置于灰度模式,但我只需要添加一个参数到 imshow() 中,以确保它正确地显示为灰度。我从下面的答案中学到,A 阻止了转换的正确进行...这是我的错误 :-) 谢谢! - adelbertc
3个回答

5
您需要在convert()方法的参数中使用模式'L'而不是'LA'。'LA'会保留一个alpha通道,然后numpy.asarray就无法按照您的意图工作。如果您需要alpha通道,则需要使用其他方法将其转换为numpy数组。否则,请使用模式'L'。

4

看起来你正在使用PIL 1.1.6之前的版本,在这个版本中他们引入了一些方法,以便numpy知道如何处理Image对象。所以你只得到了一个包含Image对象的单元素数组(这就是Out[4]显示给你的)。

相反,你需要做类似于np.asarray(img.getdata())的事情,这将为你提供一个介于0和255之间的整数的num_pixels x num_channels数组(至少对于我尝试的png文件是这样的)。你可能想要做一些

img_as_np = np.asarray(img.getdata()).reshape(img.size[1], img.size[0], -1)

将其布局类似于图像(转置)。如果您期望的格式是介于0和1之间的浮点值,则可能还希望除以255(例如,matplotlib的imshow也是如此)。请保留HTML标记。

2

使用这张图片

在IT技术中。
>>> from PIL import Image
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> Image.__version__
'1.1.7'
>>> img = Image.open('lena.png').convert('L')
>>> data = np.asarray(img.getdata()).reshape(img.size)
>>> fft = np.fft.fft2(data)
>>> fft[0, 0] = 0 # remove DC component for visualization
>>> plt.imshow(np.abs(np.fft.fftshift(fft)), interpolation='nearest')
<matplotlib.image.AxesImage object at 0x046012F0>
>>> plt.show()
>>> plt.imshow(np.abs(np.fft.fftshift(fft))[224:288, 224:288], interpolation='nearest')
<matplotlib.image.AxesImage object at 0x0476ED70>
>>> plt.show()

enter image description here


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