17

I am trying to read an image from a numpy array using PIL, by doing the following:

from PIL import Image
import numpy as np
#img is a np array with shape (3,256,256)
Image.fromarray(img)

and am getting the following error:

File "...Image.py", line 2155, in fromarray
    raise TypeError("Cannot handle this data type")

I think this is because fromarray expects the shape to be (height, width, num_channels) however the array I have is in the shape (num_channels, height, width) as it is stored in this was in an lmdb database.

How can I reshape the Image so that it is compatible with Image.fromarray?

Alex Riley
  • 169,130
  • 45
  • 262
  • 238
Aly
  • 15,865
  • 47
  • 119
  • 191

3 Answers3

15

You don't need to reshape. This is what rollaxis is for:

Image.fromarray(np.rollaxis(img, 0,3))
Lanting
  • 3,060
  • 12
  • 28
5

Try

img = np.reshape(256, 256, 3)
Image.fromarray(img)
Ryan
  • 3,555
  • 1
  • 22
  • 36
1

Defining the datatype of the numpy array to np.uint8 fixed it for me.

>>> img = np.full((256, 256), 3)
>>> Image.fromarray(img)
...
line 2753, in fromarray
raise TypeError("Cannot handle this data type: %s, %s" % typekey) from e
TypeError: Cannot handle this data type: (1, 1), <i8

So defining the array with the proper datatype:

>>> img = np.full((256, 256), 3, dtype=np.uint8)
>>> Image.fromarray(img)
<PIL.Image.Image image mode=L size=256x256 at 0x7F346EA31130>

creates the Image object successfully

Or you could simply modify the existing numpy array:

img = img.astype(np.uint8)
Arier
  • 295
  • 2
  • 6