7

目前我正在使用 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
4

3 回答 3

4

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

相反,您需要执行类似的操作np.asarray(img.getdata()),这将为您提供一个num_pixels x num_channels介于 0 和 255 之间的整数数组(至少对于我尝试过的 png)。你可能想做

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

像图像一样布局(转置)。您可能还希望除以 255 以获得 0 和 1 之间的浮点值,如果这是您期望的格式(例如 matplotlib's 也是如此imshow)。

于 2013-01-29T06:45:17.370 回答
4

您想使用模式 'L' 而不是 'LA' 作为 convert() 方法的参数。'LA' 留下一个 alpha 通道,然后 numpy.asarray 无法按预期工作。如果您需要 alpha 通道,那么您将需要一种不同的方法来转换为 numpy 数组。否则,使用模式“L”。

于 2013-01-29T06:58:49.513 回答
2

用于图像:

>>> 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()

在此处输入图像描述

于 2013-01-29T17:05:47.747 回答