Руководство по записи изображений с помощью Python

Раздел: Компьютерное зрение -> Обработка изображений

Способы сохранения изображений в Python

Основным и наиболее производительным решением для задач компьютерного зрения является библиотека OpenCV. Она поддерживает большое количество форматов (JPEG, PNG, TIFF, BMP) и позволяет тонко настраивать параметры сохранения.


import cv2

# Чтение изображения
img = cv2.imread('input.jpg')

# Сохранение в формате JPEG с качеством 95%
cv2.imwrite('output.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 95])

Python работа с изображениями библиотеки (работа с изображениями в python с помощью библиотек)

Пояснение: Функция imwrite определяет формат по расширению файла. Для JPEG используется флаг IMWRITE_JPEG_QUALITY (0-100). Для PNG - IMWRITE_PNG_COMPRESSION (0-9). Для TIFF - IMWRITE_TIFF_COMPRESSION.

Типичная ошибка: Попытка сохранить изображение с альфа-каналом в JPEG - OpenCV автоматически конвертирует его в BGR, теряя прозрачность. Для сохранения прозрачности используйте PNG.

Как сохранить изображение в формате JPEG с настройкой качества с помощью Pillow?

Библиотека Pillow (PIL) предоставляет простой интерфейс для работы с изображениями, включая сохранение с контролем качества.


from PIL import Image

im = Image.open('input.png')
# Конвертация в RGB перед сохранением в JPEG
if im.mode == 'RGBA':
    im = im.convert('RGB')
im.save('output.jpg', quality=85, optimize=True)

Python pillow image (библиотека pillow для изображений)

Пояснение: Параметр quality управляет сжатием JPEG. optimize=True улучшает сжатие без потери качества. Для PNG используется compress_level от 0 до 9.

Проблема: При сохранении изображения с альфа-каналом в JPEG возникает исключение OSError: cannot write mode RGBA as JPEG. Решение - предварительная конвертация в RGB.

Как сохранить изображение, полученное из массива данных, через Matplotlib?

Matplotlib удобен, когда изображение генерируется программно (например, тепловая карта, график).


import matplotlib.pyplot as plt
import numpy as np

# Создание случайного изображения 100x100x3
img = np.random.rand(100, 100, 3)
# Сохранение без отображения окна
plt.imsave('random.png', img, cmap='gray', vmin=0, vmax=1)

Python размер изображения (получение размеров изображения в python)

Пояснение: imsave принимает массив с плавающей точкой (0-1) или целые (0-255). Параметр cmap задаёт цветовую карту для одноканальных изображений.

Ошибка: Если массив содержит значения за пределами [0,1] для float, изображение будет искажено. Необходимо нормализовать данные или передавать vmin, vmax.

Как сохранить изображение в формате PNG с прозрачностью, используя imageio?

ImageIO - библиотека для чтения и записи изображений, поддерживающая альфа-канал.


import imageio

img = imageio.imread('with_alpha.png')
# Сохранение с сохранением прозрачности
imageio.imwrite('output.png', img, compress_level=6)

Python сохранить изображение (сохранение изображения с помощью python)

Пояснение: ImageIO автоматически определяет формат. Для нового API рекомендуется imageio.v3.imwrite. Параметр compress_level работает только для PNG.

Трудность: Старый интерфейс imageio.imwrite может не поддерживать некоторые метаданные. Для полного контроля используйте imageio.v3.imwrite с именованными параметрами.

Как сохранить изображение после обработки фильтрами с помощью scikit-image?

Scikit-image часто применяется для научной обработки изображений. Функция imsave работает с массивами.


from skimage import io, filters

img = io.imread('input.jpg')
blurred = filters.gaussian(img, sigma=2)
io.imsave('blurred.jpg', blurred)

Пояснение: Scikit-image ожидает данные в формате float (0-1) для целочисленных типов. imsave автоматически масштабирует значения при необходимости.

Потенциальная проблема: При сохранении изображений с типом float (0-1) в JPEG scikit-image сначала конвертирует в uint8, что может вызвать потерю точности. Для прецизионного сохранения используйте TIFF или PNG.

Расширенные примеры сохранения изображений

1. Сохранение с разными параметрами сжатия

Пример

import cv2
import numpy as np

# Создание тестового изображения
img = np.zeros((200, 200, 3), dtype=np.uint8)
cv2.rectangle(img, (50,50), (150,150), (0,255,0), -1)

# Сохранение с разными уровнями качества JPEG
for q in [10, 50, 90]:
    cv2.imwrite(f'quality_{q}.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, q])
    print(f"Файл quality_{q}.jpg создан")
# Результат: размер файла уменьшается с уменьшением качества
Файл quality_10.jpg создан
Файл quality_50.jpg создан
Файл quality_90.jpg создан

2. Сохранение в буфер памяти (BytesIO) для дальнейшей передачи по сети

Пример

import io
import cv2
import numpy as np
from PIL import Image

# Создание изображения
img = np.random.randint(0, 255, (256, 256, 3), dtype=np.uint8)

# Способ 1: через OpenCV
_, buffer = cv2.imencode('.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 80])
bytes_data = buffer.tobytes()
print(f"OpenCV: размер буфера {len(bytes_data)} байт")

# Способ 2: через PIL
pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
buf = io.BytesIO()
pil_img.save(buf, format='PNG')
bytes_data_pil = buf.getvalue()
print(f"PIL: размер буфера {len(bytes_data_pil)} байт")
OpenCV: размер буфера 12345 байт
PIL: размер буфера 67890 байт

3. Сохранение изображения с EXIF-данными (метаданными) с помощью Pillow

Пример

from PIL import Image
from PIL.ExifTags import Base

img = Image.new('RGB', (100, 100), color='red')
exif_data = img.getexif()
exif_data[Base.Make] = 'Python'
exif_data[Base.Model] = 'TestCamera'
# Сохраняем с EXIF
expected_format = 'input_exif.jpg'
img.save(expected_format, exif=exif_data, quality=95)

# Проверка: чтение EXIF
loaded = Image.open(expected_format)
loaded_exif = loaded.getexif()
print(loaded_exif[Base.Make])  # 'Python'
Python

4. Сохранение последовательности изображений (кадров) в один файл TIFF

Пример

import cv2
import numpy as np

# Создаём 5 кадров
frames = [np.random.randint(0, 255, (100, 100, 3), dtype=np.uint8) for _ in range(5)]
# Сохранение в многостраничный TIFF
# OpenCV не поддерживает многостраничный TIFF, поэтому используем imageio
import imageio
imageio.mimwrite('multipage.tif', frames, format='TIFF')
print('Многостраничный TIFF создан')
Многостраничный TIFF создан

5. Сохранение изображения из веб-камеры в реальном времени

Пример

import cv2

cap = cv2.VideoCapture(0)
ret, frame = cap.read()
if ret:
    cv2.imwrite('webcam_snapshot.jpg', frame)
    print('Снимок сохранён')
else:
    print('Не удалось захватить кадр')
cap.release()
Снимок сохранён

6. Сохранение изображения с пользовательской цветовой картой (LUT) с помощью OpenCV

Пример

import cv2
import numpy as np

# Загрузка изображения в градациях серого
gray = cv2.imread('gray_image.jpg', 0)
# Применение цветовой карты (jet)
colored = cv2.applyColorMap(gray, cv2.COLORMAP_JET)
cv2.imwrite('colored_jet.png', colored)
print('Цветное изображение сохранено')
Цветное изображение сохранено

Сохранение изображения с помощью Python - comments

En
Python сохранить изображение (python)