PIL TypeError: Cannot handle this data type

孤者浪人 提交于 2020-03-17 08:47:04

问题


I have an image stored in a numpy array that I want to convert to PIL.Image in order to perform an interpolation only available with PIL.

When trying to convert it through Image.fromarray() it raises the following error:

TypeError: Cannot handle this data type

I have read the answers here and here but they do not seem to help in my situation.

What I'm trying to run:

from PIL import Image

x  # a numpy array representing an image, shape: (256, 256, 3)

Image.fromarray(x)

回答1:


tl;dr

Does x contain uint values in [0, 255]? If not and especially if x ranges from 0 to 1, that is the reason for the error.


Explanation

Most image libraries (e.g. matplotlib, opencv, scikit-image) have two ways of representing images:

  • as uint with values ranging from 0 to 255.
  • as float with values ranging from 0 to 1.

The latter is more convenient when performing operations between images and thus is more popular in the field of Computer Vision. However PIL seems to not support it for RGB images.

If you take a look here it seems that when you try to read an image from an array, if the array has a shape of (height, width, 3) it automatically assumes it's an RGB image and expects it to have a dtype of uint8! In your case, however, you have an RBG image with float values from 0 to 1.


Solution

You can fix it by converting your image to the format expected by PIL:

im = Image.fromarray((x * 255).astype(np.uint8))


来源:https://stackoverflow.com/questions/55319949/pil-typeerror-cannot-handle-this-data-type

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!