目前我正在使用PIL和NumPy。我有一张彩色png
图片,我想:
这就是我正在尝试的(在IPython w / --pylab
标志中):
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
答案 0 :(得分:4)
看起来你正在使用1.1.6之前的PIL版本,其中they introduced the methods so that numpy would know what to do with an Image
。所以你只是将img_as_np
作为包含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)
像图像(转置)一样布局。您可能还希望除以255以获得介于0和1之间的浮点值,如果这是您期望的格式(例如matplotlib的imshow
)。
答案 1 :(得分:4)
您希望使用模式“L”而不是“LA”作为convert()方法的参数。 'LA'留下了一个alpha通道,然后numpy.asarray无法正常工作。如果您需要alpha通道,那么您将需要一个不同的方法来转换为numpy数组。否则,请使用模式“L”。
答案 2 :(得分:1)
将this用于图片:
>>> 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()