用于傅里叶变换的灰度图像到NumPy阵列

时间:2013-01-29 06:35:16

标签: python image-processing numpy python-imaging-library fft

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

  1. 以灰度阅读
  2. 转换为NumPy数组
  3. 对阵列执行FFT
  4. 显示图片
  5. 这就是我正在尝试的(在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
    

3 个答案:

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

enter image description here