PIL TypeError: Невозможно обработать этот тип данных - PullRequest
1 голос
/ 24 марта 2019

У меня есть изображение, хранящееся в массиве numpy, который я хочу преобразовать в PIL.Image, чтобы выполнить интерполяцию, доступную только для PIL.

При попытке преобразовать его через Image.fromarray() оно вызываетследующая ошибка:

TypeError: Не удается обработать этот тип данных

Я прочитал ответы здесь и здесь , но онине похоже, чтобы помочь в моей ситуации.

То, что я пытаюсь запустить:

from PIL import Image

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

Image.fromarray(x)

1 Ответ

1 голос
/ 24 марта 2019

tl; др

Содержит ли x значение uint в [0, 255]?Если нет и особенно если x находится в диапазоне от 0 до 1, это является причиной ошибки.


Объяснение

Большинство библиотек изображений (например, matplotlib, opencv, scikit-image)) два способа представления изображений:

  • как uint со значениями в диапазоне от 0 до 255.
  • как float со значениями в диапазоне от 0 до 1.

Последний более удобен при выполнении операций между изображениями и, следовательно, более популярен в области компьютерного зрения.Однако PIL, похоже, не поддерживает его для изображений RGB .

Если вы посмотрите здесь , то кажется, что при попытке прочитать изображение из массива, еслимассив имеет форму (height, width, 3), он автоматически предполагает, что это RGB-изображение, и ожидает, что он будет иметь dtype из uint8!Однако в вашем случае у вас есть изображение RBG со значениями float от 0 до 1.


Решение

Это можно исправить, преобразовав изображение в формат, ожидаемыйPIL:

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