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

Раздел: Python -> Обработка изображений

Введение в обработку изображений на Python

Python предлагает множество библиотек для работы с изображениями: Pillow, OpenCV, scikit-image, imageio и другие. Каждая из них решает определённый круг задач. Рассмотрим эффективные подходы с конкретными примерами кода.

Как открыть, изменить размер и сохранить изображение с помощью Pillow?

Библиотека Pillow (форк PIL) - стандартный инструмент для базовых операций: загрузки, изменения геометрии, фильтрации и сохранения в популярных форматах.


from PIL import Image
img = Image.open('input.jpg')
print('Исходный размер:', img.size)
resized = img.resize((400, 300))
resized.save('output.jpg')
print('Готово')

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

Image.open открывает файл, resize возвращает новое изображение с заданными размерами, save сохраняет результат. Обратите внимание, что метод resize не изменяет оригинал.

Типичные ошибки и их решения:

  • FileNotFoundError: проверьте путь и права доступа.
  • OSError при сохранении RGBA в JPEG: предварительно конвертируйте в RGB.
  • 
    if img.mode == 'RGBA':
        img = img.convert('RGB')
    

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

  • Потеря качества при многократном сохранении: используйте параметры (например, quality=95 для JPEG).

Цель: подготовка изображений для веба, создание миниатюр, конвертация форматов.

Как выполнить поворот и отражение изображения с использованием OpenCV?

OpenCV (cv2) предоставляет функции геометрических преобразований и компьютерного зрения.


import cv2
img = cv2.imread('input.jpg')
# Поворот на 90 градусов по часовой
rotated = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
# Горизонтальное отражение
flipped = cv2.flip(img, 1)
cv2.imwrite('rotated.jpg', rotated)
cv2.imwrite('flipped.jpg', flipped)

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

OpenCV использует порядок каналов BGR, в отличие от Pillow. Для корректного отображения через matplotlib применяется cv2.cvtColor(img, cv2.COLOR_BGR2RGB).

Проблемы:

  • Поворот возможен только на углы, кратные 90°, с помощью cv2.rotate. Для произвольного угла требуется аффинное преобразование.
  • При отражении путаница с осью: 0 - вертикальное, 1 - горизонтальное, -1 - одновременно.
  • Путь к файлу не должен содержать кириллицы в некоторых версиях OpenCV - используйте латиницу.

Случаи использования: предобработка датасетов, исправление ориентации, создание зеркальных копий.

Как применить фильтр размытия и выявить границы средствами scikit-image?

Scikit-image (skimage) основана на numpy и включает алгоритмы научной обработки.


from skimage import io, filters, feature
img = io.imread('input.jpg')
blurred = filters.gaussian(img, sigma=3)
edges = feature.canny(img, sigma=1)
io.imsave('blurred.jpg', blurred)
io.imsave('edges.jpg', edges)

Параметр sigma отвечает за степень размытия. Детектор Кэнни находит границы объектов.

Возможные ошибки:

  • Изображение должно быть uint8 или float в диапазоне [0,1]. При передаче int64 может возникнуть предупреждение. Приведите тип: img = img.astype(float) / 255.
  • Детектор Кэнни чувствителен к шуму - предварительно применяйте размытие.
  • Сохранение результатов в JPEG может дать артефакты - используйте PNG для чёрно-белых карт.

Применение: анализ микроскопии, медицинская визуализация, выделение контуров.

Дополнительные расширенные примеры

Создание коллажа из нескольких изображений с помощью Pillow

Иногда требуется объединить несколько изображений в одно. Используем метод paste.

Пример

from PIL import Image

# Загружаем четыре изображения
im1 = Image.open('photo1.jpg').resize((300, 200))
im2 = Image.open('photo2.jpg').resize((300, 200))
im3 = Image.open('photo3.jpg').resize((300, 200))
im4 = Image.open('photo4.jpg').resize((300, 200))

# Создаём холст 600x400
canvas = Image.new('RGB', (600, 400), (255, 255, 255))

# Размещаем изображения
canvas.paste(im1, (0, 0))
canvas.paste(im2, (300, 0))
canvas.paste(im3, (0, 200))
canvas.paste(im4, (300, 200))

canvas.save('collage.jpg')
Результат: файл collage.jpg размером 600x400, содержащий 4 изображения расположенные сеткой 2×2.

Наложение прозрачного водяного знака с альфа-каналом

Водяной знак с полупрозрачностью добавляется через композицию с использованием маски.

Пример

from PIL import Image

# Основное изображение
base = Image.open('base.jpg').convert('RGBA')
# Водяной знак (PNG с прозрачностью)
watermark = Image.open('logo.png').convert('RGBA')
# Масштабируем знак
watermark = watermark.resize((150, 150))
# Позиция (нижний правый угол)
pos = (base.width - watermark.width - 10, base.height - watermark.height - 10)
# Создаём копию основного изображения и вставляем
base.paste(watermark, pos, watermark)  # третий аргумент - маска
base.save('watermarked.png')
Итог: изображение с наложенным полупрозрачным логотипом. Прозрачность сохраняется благодаря RGBA.

Пакетная обработка изображений в папке (конвертация и изменение размера)

Автоматизация преобразования всех файлов в каталоге.

Пример

import os
from PIL import Image

input_dir = 'photos'
output_dir = 'thumbnails'
os.makedirs(output_dir, exist_ok=True)

for filename in os.listdir(input_dir):
    if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')):
        img = Image.open(os.path.join(input_dir, filename))
        img.thumbnail((200, 200))  # сохраняет пропорции
        out_path = os.path.join(output_dir, filename)
        img.convert('RGB').save(out_path, 'JPEG', quality=85)
        print(f'Обработан {filename}')
В папке thumbnails появятся уменьшенные копии с максимум 200px по большей стороне.

Анализ гистограммы и коррекция освещения

Используем OpenCV для выравнивания гистограммы.

Пример

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('dark.jpg', cv2.IMREAD_GRAYSCALE)
equalized = cv2.equalizeHist(img)

# Показ гистограмм
plt.subplot(1,2,1)
plt.hist(img.ravel(), 256, [0,256])
plt.title('До')
plt.subplot(1,2,2)
plt.hist(equalized.ravel(), 256, [0,256])
plt.title('После')
plt.show()

cv2.imwrite('equalized.jpg', equalized)
Результат: изображение с улучшенным контрастом. Гистограмма становится более равномерной.

Детекция лиц с использованием каскадов Хаара в OpenCV

Классическая задача компьютерного зрения.

Пример

import cv2

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
img = cv2.imread('group.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv2.imwrite('faces_detected.jpg', img)
print(f'Найдено лиц: {len(faces)}')
На выходном изображении лица обведены зелёными прямоугольниками.

Бинаризация и работа с масками (scikit-image)

Создание бинарной маски по порогу.

Пример

from skimage import io, filters, morphology

img = io.imread('grayscale.png')
thresh = filters.threshold_otsu(img)
binary = img > thresh

# Убираем мелкие объекты
cleaned = morphology.remove_small_objects(binary, min_size=100)
io.imsave('mask.png', cleaned.astype('uint8')*255)
Маска белого цвета на чёрном фоне выделяет области, превышающие порог Оцу.

Работа с изображениями в Python с помощью библиотек - comments

En
Python работа с изображениями библиотеки (python)