PIL TypeError: Cannot handle this data type

后端 未结 2 741
囚心锁ツ
囚心锁ツ 2021-02-01 02:28

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 con

相关标签:
2条回答
  • 2021-02-01 03:19

    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))
    
    0 讨论(0)
  • 2021-02-01 03:25

    I solved it different way.

    Problem Situation: When working with gray image or binary image, if the numpy array shape is (height, width, 1), this error will be raised also.
    For example, a 32 by 32 pixel gray image (value 0 to 255)

    np_img = np.random.randint(low=0, high=255, size=(32, 32, 1), dtype=np.uint8)
    # np_img.shape == (32, 32, 1)
    pil_img = Image.fromarray(np_img)
    

    will raise TypeError: Cannot handle this data type: (1, 1, 1), |u1

    Solution:

    If the image shape is like (32, 32, 1), reduce dimension into (32, 32)

    np_img = np.squeeze(np_img, axis=2)  # axis=2 is channel dimension 
    pil_img = Image.fromarray(np_img)
    

    This time it works!!

    Additionally, please make sure the dtype is uint8(for gray) or bool(for binary).

    0 讨论(0)
提交回复
热议问题