Сообщить об ошибке.

Функция Image.composite() модуля Pillow в Python

Смешивания изображений с использованием маски

Синтаксис:

from PIL import Image

img = Image.composite(im1, im2, mask)

Параметры:

  • im1 - первое изображение/картинка.
  • im2 - второе изображение/картинка. Должно иметь тот же режим и размер, что и первое изображение.
  • mask - изображение маски. Это изображение может иметь режим 1, L или RGBA и должно иметь тот же размер, что и два других изображения.

Возвращаемое значение:

  • Объект изображения Image.

Описание:

Функция Image.composite() модуля Pillow создает составное изображение путем смешивания изображений с использованием маски прозрачности.

  • Если картинки имеют разный размер, то одинаковый размер можно создать применив к изображениям метод Image.resize().
  • Если картинки имеют разные режимы, то режим одного изображения можно конвертировать методом Image.convert().

Если делать такое в NumPy, то формула по которой расчитывается объединение изображений и маски будет следующая:

для маски в режиме `1`
arr_result = arr_mask * arr_image1 + (1 - arr_mask) * arr_image2

для маски в режиме `L`
arr_result = arr_mask / 255 * arr_image1 + (1 - arr_mask / 255 ) * arr_image2

Как обрабатывать изображения в NumPy смотрите:

Пример смешивания изображений с использованием маски:

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

from PIL import ImageGrab
import time

# сделаем скриншоты с задержкой в 2 секунды
# запускаем скрипт и переключаемся на рабочий стол
time.sleep(2)
# создание скриншота 
scr1 = ImageGrab.grab()
# сохраняем скриншот
scr1.save('scr1.jpg')

# считаем до двух и переключаемся на окно браузера
time.sleep(3)
scr2 = ImageGrab.grab()
scr2.save('scr1.jpg')

Далее сделаем "виньетку" из этих двух картинок, объединив их по маске (белый прямоугольник на черном фоне).

from PIL import Image, ImageDraw, ImageFilter

# открываем скриншот рабочего стола 
scr1 = Image.open('scr1.jpg')
# открываем скриншот окна сайта 
scr2 = Image.open('scr2.jpg')

# создадим черно-белую маску 
# такого же размера как и скриншоты
mask = Image.new('L', scr1.size, 0)
# получаем контекст рисования
d = ImageDraw.Draw(mask)
# по центру нарисуем прямоугольник
# зададим отступ от краев
indent = 200
# рассчитаем координаты прямоугольника
size = (indent, indent, scr1.size[0] - indent, scr1.size[1] - indent)
# рисуем прямоугольник
d.rectangle(size, fill=255)

####################################
# накладываем изображений по маске #
####################################
img = Image.composite(scr2, scr1, mask)
# сохраняем и смотрим что получилось
img.save('test_composite.png')

# теперь размоем маску фильтром GaussianBlur()
mask = mask.filter(ImageFilter.GaussianBlur(20))
img = Image.composite(scr2, scr1, mask)
# сохраняем и смотрим что получилось
img.save('test_composite_blur.png')

# или в качестве маски используем линейный градиент
mask = Image.linear_gradient('L').resize(scr1.size)
img = Image.composite(scr2, scr1, mask)
# сохраняем и смотрим что получилось
img.save('test_linear_gradient.png')

# радиальный градиент
mask = Image.radial_gradient('L').resize(scr1.size)
img = Image.composite(scr2, scr1, mask)
# сохраняем и смотрим что получилось
img.save('test_radial_gradient.png')