Преобразование Numpy массива в изображение без PIL

Пройдите тест, узнайте какой профессии подходите

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

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

Для преобразования массива Numpy в изображение вы можете воспользоваться функцией matplotlib.pyplot.imsave(). В приведенном ниже коде демонстрируется его использование с помощью библиотеки matplotlib:

Python
Скопировать код
import matplotlib.pyplot as plt
import numpy as np

# Создаем массив и сохраняем его в формате изображения
plt.imsave('image.png', np.random.rand(100, 100), cmap='gray')

Если вам требуется сохранить реальное RGB-изображение, просто опустите параметр cmap. Как альтернативу, вы можете использовать библиотеку imageio, поддерживающую множество форматов изображений:

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

# Сохраняем RGB-изображение с помощью imageio
imageio.imwrite('image.png', (255 * np.random.rand(100, 100, 3)).astype(np.uint8))

Не забывайте, что ваш массив должен быть преобразован к диапазону значений от 0 до 255 и типу данных uint8, чтобы он соответствовал формату 8-битного цветного изображения.

Кинга Идем в IT: пошаговый план для смены профессии

Использование Python для сохранения изображений: выбор библиотек

Рассмотрим несколько альтернативных способов сохранения изображений из массивов.

Работа с библиотекой OpenCV

OpenCV – это надежная библиотека, предназначенная для обработки изображений. Для сохранения изображений ее функция cv2.imwrite() – лучший выбор:

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

# Создаем цветной массив и сохраняем его
array = (np.random.rand(100, 100, 3) * 255).astype(np.uint8)
cv2.imwrite('PsychedelicJPG.jpg', array)

Использование Pillow для производительной работы с изображениями

Pillow, являющийся продолжением PIL, отличается пользовательским интерфейсом и поддержкой множества форматов. С его помощью легко сохранять изображения:

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

# Преобразуем массив в изображение и сохраняем его
array = np.random.rand(100, 100, 3) * 255
image = Image.fromarray(array.astype(np.uint8))
image.save('pic_with_pillow.png')

Ручное создание файла в формате PNG

Если нужно полностью контролировать процесс, вы можете самостоятельно создать PNG-файл используя библиотеки zlib и struct:

Python
Скопировать код
import zlib
import struct
import numpy as np

# Создаем бинарный PNG-файл из массива
array = np.random.rand(100, 100).astype(np.uint8)
# Процесс записи бинарных данных в PNG...

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

Превращение массива Numpy в изображение можно сравнить с созданием шедевра кондитерского искусства из вегетарианских ингредиентов:

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

# Создаем и сохраняем изображение из массива
array = np.array([[255, 0, 0], [0, 255, 0], [0, 0, 255]], dtype=np.uint8)
img = Image.fromarray(array)
img.save('vegan_triangle.png')

В итоге вы получите цветное изображение, а сам процесс напоминает магию высокого поварского мастерства.

Особенности сохранения изображений

Работа со монотонными изображениями

При обработке монотонных изображений используйте параметр cmap в библиотеке matplotlib:

Python
Скопировать код
import matplotlib.pyplot as plt
import numpy as np

# Визуализируем и сохраняем монохромное изображение
array = np.random.rand(100, 100)
plt.imshow(array, cmap="gray")
plt.imsave("monochrome_matters.png", array, cmap="gray")

Обработка прозрачности

Если ваш массив содержит канал прозрачности (RGBA), убедитесь, что вы обрабатываете его правильно:

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

# Сохраняем RGBA-изображение
rgba_array = np.random.rand(100, 100, 4) * 255
imageio.imwrite('being_hauntingly_transparent.png', rgba_array.astype(np.uint8))

Масштабирование для корректного отображения

Для сохранения правильного восприятия цвета изображению следует выполнять масштабирование:

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

# Нормализуем и сохраняем изображение
array = np.random.rand(100, 100)
array_normalized = (array – array.min()) / (array.max() – array.min()) * 255
image = Image.fromarray(array_normalized.astype(np.uint8))
image.save('image_scaling_vogue.png')

Обработка изображений в памяти

Можно работать с изображениями в памяти, без необходимости их сохранения в файл:

Python
Скопировать код
import matplotlib.pyplot as plt
import numpy as np
import io

# Сохраняем изображение в буфере, а не в файле
array = np.random.rand(100, 100)
buffer = io.BytesIO()
plt.imsave(buffer, array, format='png')
buffer.seek(0)

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

  1. Документация функции Matplotlib Pyplot imsave
  2. Документация метода Pillow (PIL Fork) Image.fromarray
  3. Обработка многомерных изображений (scipy.ndimage) — Руководство SciPy v1.12.0
  4. Быстрый старт с NumPy — Руководство NumPy v1.26
  5. Обсуждение на Stack Overflow о сохранении массивов NumPy в формате изображений