Перевод изображения PIL в NumPy и обратно: быстрый метод
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Переход от изображения PIL к массиву NumPy можно выполнить с использованием функции np.array()
:
import numpy as np
from PIL import Image
image = Image.open('image.jpg') # Откройте изображение
image_array = np.array(image) # Теперь оно преобразовано в массив NumPy
О полученном массиве нужно узнать, что он имеет три измерения — высоту, ширину и количество каналов (три для RGB, четыре для RGBA).
Чтобы преобразовать массив NumPy обратно в изображение PIL, используйте следующий код:
modified_image = Image.fromarray(image_array)
modified_image.save('modified_image.jpg') # И затем сохраните его
Не забудьте проверить, что массив имеет правильный тип и форму, соответствующую режиму изображения PIL.
Возвращение в мир PIL
Если вы хотите изменить пиксели изображения с помощью данных массива NumPy, используйте следующий код:
# Определим 'pix' как изменённый масив NumPy
image.paste(Image.fromarray(pix))
Метод image.paste()
требует чтобы размеры массива соответствовали размерам изображения, а функция Image.fromarray()
требует соответствия формата цвета и типа данных.
Работа с цветовыми режимами
Если вы работаете с различными цветовыми режимами, примените следующий код:
# Превращение в оттенки серого
grayscale_image = image.convert('L')
grayscale_array = np.array(grayscale_image)
# Если вы работаете с изображениями RGBA или конвертируете RGB в BGR, используйте:
bgr_image_array = image_array[..., ::-1] # Инвертируйте каналы
Если вам необходимо изменить порядок каналов, вы можете использовать np.rollaxis()
или np.transpose()
.
Создание собственных функций
Для облегчения повторяющихся операций полезно создать свои собственные функции:
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, учитывая, что от них зависит формат представления данных (по столбцам или по строкам):
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 могут использовать разные методы для координат пикселей.
Полезные материалы
- Документация по Pillow (форк PIL) — надежный источник информации о библиотеке Pillow.
- numpy.asarray — Руководство по NumPy — здесь вы найдете информацию о том, как использовать
np.asarray
. - Как превратить изображение PIL в массив NumPy? – Stack Overflow — практические рекомендации по этой теме.
- Основы работы с NumPy для новичков — руководство по NumPy — введение в основы работы с массивами NumPy.
- Обработка и анализ изображений с помощью Numpy и Scipy — заметки по лекциям Scipy — продвинутые техники работы с изображениями.
- Обработка изображений в Python с помощью Pillow — руководство по обработке изображений с использованием библиотеки Pillow.