Currently I'm using PIL and NumPy. I have a colored png
image and I want to:
- Read it in in grayscale
- Convert to NumPy array
- Perform a FFT on array
- Display the image
This is what I'm trying (in IPython w/ --pylab
flag):
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
It looks like you're using a version of PIL prior to 1.1.6, where they introduced the methods so that numpy would know what to do with an
Image
. So you're just gettingimg_as_np
as a one-element array containing anImage
object (which is whatOut[4]
is showing you).You instead need to do something like
np.asarray(img.getdata())
, which will give you anum_pixels x num_channels
array of integers between 0 and 255 (at least for the png I tried). You may want to doto lay it out like the image (transposed). You might also want to divide by 255 to get float values between 0 and 1, if that's the format you're expecting (as does e.g. matplotlib's
imshow
).Using this for an image:
You want to use the mode 'L' instead of 'LA' as the parameter to the convert() method. 'LA' leaves an alpha channel and then the numpy.asarray doesn't work as you intended. If you need the alpha channel, then you will need a different method to convert to a numpy array. Otherwise, use mode 'L'.