Nano Hash - криптовалюты, майнинг, программирование

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

У меня есть изображение, хранящееся в массиве 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)

  • Вопрос не имеет ничего общего с machine-learning или deep-learning - не спамите нерелевантные теги (удалены). 24.03.2019
  • Покажите, пожалуйста, пример того, как выглядят ваши данные, иначе невозможно сказать, в чем проблема. 24.03.2019
  • @desertnaut Я подумал, что, поскольку я использую изображения для классификации с помощью CNN, теги могут быть актуальными. 25.03.2019
  • Нет, теги должны относиться только к вопросу content, а не к контексту; нет проблем, просто имейте это в виду на будущее 25.03.2019

Ответы:


1

tl;dr

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))
24.03.2019
  • Это действительно помогло! К сожалению, PIL не поддерживает изображения RBG со значениями в [0, 1]. 25.03.2019
  • Я получаю следующее предупреждение Lossy conversion from float64 to uint8. Range [0, 1]. Convert image to uint8 prior to saving to suppress this warning. Что означает диапазон [0,1]? Мой диапазон x был [0,2] 11.07.2020
  • @ BlackJack21 Я думаю, это означает, что вы должны сначала преобразовать свой диапазон в [0,1], а затем попробовать преобразовать его в uint8 11.07.2020
  • Нет, я тоже пытался это сделать, но ошибка осталась. Это было в Jupyter Lab, могло ли это быть связано с ipynb? 11.07.2020
  • @ BlackJack21 нет, это не имеет ничего общего с окружающей средой. Проблема в самом пакете (т.е. PIL) ... 12.07.2020
  • Преобразование типа в np.uint8 сделало это! Спасибо. 24.03.2021

  • 2

    Я решил это по-другому.

    Проблемная ситуация: при работе с серым изображением или двоичным изображением, если numpy форма массива - (height, width, 1), эта ошибка также будет возникать.
    Например, серое изображение размером 32 на 32 пикселя (значение от 0 до 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)
    

    поднимет TypeError: Cannot handle this data type: (1, 1, 1), |u1

    Решение:

    Если форма изображения похожа на (32, 32, 1), уменьшите размер до (32, 32)

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

    На этот раз работает !!

    Кроме того, убедитесь, что dtype = uint8 (для серого) или bool (для двоичного).

    14.12.2020

    3

    В моем случае я обнаружил другую проблему с той же ошибкой. Изображение, которое я использовал, было в формате RGBA, поэтому перед использованием функции fromarray () просто преобразуйте его в RGB с помощью функции convert (), и она будет работать отлично.

    image_file = Image.open(image_file)
    image_file = image_file.convert('RGB')
    

    P.S .: Размещение этого решения в качестве начального шага перед преобразованием изображения в np.

    29.04.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..