Перевод изображения PIL в NumPy и обратно: быстрый метод

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Переход от изображения PIL к массиву NumPy можно выполнить с использованием функции np.array():

Python
Скопировать код
import numpy as np
from PIL import Image

image = Image.open('image.jpg')  # Откройте изображение
image_array = np.array(image)    # Теперь оно преобразовано в массив NumPy

О полученном массиве нужно узнать, что он имеет три измерения — высоту, ширину и количество каналов (три для RGB, четыре для RGBA).

Чтобы преобразовать массив NumPy обратно в изображение PIL, используйте следующий код:

Python
Скопировать код
modified_image = Image.fromarray(image_array)
modified_image.save('modified_image.jpg')  # И затем сохраните его

Не забудьте проверить, что массив имеет правильный тип и форму, соответствующую режиму изображения PIL.

Возвращение в мир PIL

Если вы хотите изменить пиксели изображения с помощью данных массива NumPy, используйте следующий код:

Python
Скопировать код
# Определим 'pix' как изменённый масив NumPy
image.paste(Image.fromarray(pix))

Метод image.paste() требует чтобы размеры массива соответствовали размерам изображения, а функция Image.fromarray() требует соответствия формата цвета и типа данных.

Работа с цветовыми режимами

Если вы работаете с различными цветовыми режимами, примените следующий код:

Python
Скопировать код
# Превращение в оттенки серого
grayscale_image = image.convert('L')
grayscale_array = np.array(grayscale_image)

# Если вы работаете с изображениями RGBA или конвертируете RGB в BGR, используйте:
bgr_image_array = image_array[..., ::-1]  # Инвертируйте каналы

Если вам необходимо изменить порядок каналов, вы можете использовать np.rollaxis() или np.transpose().

Создание собственных функций

Для облегчения повторяющихся операций полезно создать свои собственные функции:

Python
Скопировать код
def pil2array(img):
    """Преобразует изображение PIL в массив NumPy"""
    return np.array(img)

def array2pil(arr, mode='RGB'):
    """Преобразует массив NumPy обратно в изображение PIL"""
    return Image.fromarray(np.uint8(arr), mode)

Практика с новыми инструментами (PIL, NumPy)

Необходимо следить за версиями Python, PIL и NumPy, учитывая, что от них зависит формат представления данных (по столбцам или по строкам):

Python
Скопировать код
image_array = np.array(image)  # Формат по столбцам (по умолчанию)
image_array = np.ascontiguousarray(image_array)  # Формат по строкам

Визуализация

Сначала мы имеем изображение, представленное в PIL:

Изображение PIL (📷): [Пиксель 1, Пиксель 2, Пиксель 3, ...]

Затем мы его преобразуем:

📷 ➡️🌀➡️ 🥗: np.array(Image)

В итоге получаем массив NumPy, который в цифровом виде представляет изображение:

Массив NumPy (🥗): [[Данные пикселя], ..., [Данные пикселя]]

Углубление в продвинутую обработку изображения

На поле боя продвинутой обработки изображений вас будут ждать:

  • Срезы NumPy: универсальный способ работы с частями изображения.
  • Методы фильтрации и трансформации: с их помощью можно улучшить качество изображения.
  • Модели машинного обучения: в которых массивы NumPy используются для обучения нейросетей.

Чтобы освоить дополнительные методы, посмотрите соответствующие разделы в документации PIL и NumPy.

Обеспечение корректной работы (потенциальные проблемы)

Следите за:

  • Памятью: обработка больших массивов занимает большой объем оперативной памяти.
  • Типами данных: стоит обратить внимание на режимы 'I' и 'F', ведь они создают массивы именно такого типа данных.
  • Системами координат: PIL и NumPy могут использовать разные методы для координат пикселей.

Полезные материалы

  1. Документация по Pillow (форк PIL) — надежный источник информации о библиотеке Pillow.
  2. numpy.asarray — Руководство по NumPy — здесь вы найдете информацию о том, как использовать np.asarray.
  3. Как превратить изображение PIL в массив NumPy? – Stack Overflow — практические рекомендации по этой теме.
  4. Основы работы с NumPy для новичков — руководство по NumPy — введение в основы работы с массивами NumPy.
  5. Обработка и анализ изображений с помощью Numpy и Scipy — заметки по лекциям Scipy — продвинутые техники работы с изображениями.
  6. Обработка изображений в Python с помощью Pillow — руководство по обработке изображений с использованием библиотеки Pillow.