Преобразование Numpy массива в изображение без PIL
Быстрый ответ
Для преобразования массива Numpy в изображение вы можете воспользоваться функцией matplotlib.pyplot.imsave()
. В приведенном ниже коде демонстрируется его использование с помощью библиотеки matplotlib:
import matplotlib.pyplot as plt
import numpy as np
# Создаем массив и сохраняем его в формате изображения
plt.imsave('image.png', np.random.rand(100, 100), cmap='gray')
Если вам требуется сохранить реальное RGB-изображение, просто опустите параметр cmap
. Как альтернативу, вы можете использовать библиотеку imageio, поддерживающую множество форматов изображений:
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-битного цветного изображения.
Использование Python для сохранения изображений: выбор библиотек
Рассмотрим несколько альтернативных способов сохранения изображений из массивов.
Работа с библиотекой OpenCV
OpenCV – это надежная библиотека, предназначенная для обработки изображений. Для сохранения изображений ее функция cv2.imwrite()
– лучший выбор:
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, отличается пользовательским интерфейсом и поддержкой множества форматов. С его помощью легко сохранять изображения:
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
:
import zlib
import struct
import numpy as np
# Создаем бинарный PNG-файл из массива
array = np.random.rand(100, 100).astype(np.uint8)
# Процесс записи бинарных данных в PNG...
Визуализация
Превращение массива Numpy в изображение можно сравнить с созданием шедевра кондитерского искусства из вегетарианских ингредиентов:
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:
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), убедитесь, что вы обрабатываете его правильно:
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))
Масштабирование для корректного отображения
Для сохранения правильного восприятия цвета изображению следует выполнять масштабирование:
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')
Обработка изображений в памяти
Можно работать с изображениями в памяти, без необходимости их сохранения в файл:
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)
Полезные материалы
- Документация функции Matplotlib Pyplot imsave
- Документация метода Pillow (PIL Fork) Image.fromarray
- Обработка многомерных изображений (scipy.ndimage) — Руководство SciPy v1.12.0
- Быстрый старт с NumPy — Руководство NumPy v1.26
- Обсуждение на Stack Overflow о сохранении массивов NumPy в формате изображений