Как размыть непрямоугольную или круглую область изображения с помощью Python PIL? - PullRequest
0 голосов
/ 11 июня 2018

Используя PIL в Python, я накладываю изображение PNG поверх другого, большего изображения.Меньшее изображение полупрозрачно.

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

box = (3270, 1150, 4030, 2250)      # (x1, y1, x2, y2)
ic = outputImage.crop(box)
ic = ic.filter(ImageFilter.BoxBlur(20))
outputImage.paste(ic, box)

Однако мне нужно размыть прямоугольную область с закругленными углами .

Вот как выглядит наложенное изображение:

image

Итак, возможно ли определить пользовательскую форму для области обрезки в PIL?

Если нет, возможно ли хотя бы обрезать участки в форме круга?(Для полного охвата и без навеса моя область должна была бы быть разбита на 6 подразделов: 4 круга и 2 прямоугольника. Выполнение всего этого замедлит мой код, но я приму любое решение, которое смогу получить.)

Я понимаю, что это можно сделать с помощью Numpy , но я бы предпочел использовать PIL, потому что все остальное в этом скрипте уже закодировано с PIL.

1 Ответ

0 голосов
/ 12 июня 2018

Взгляните на этот пример (функция округлого прямоугольника от здесь ):

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFilter

def rounded_rectangle(draw, xy, rad, fill=None):
    x0, y0, x1, y1 = xy
    draw.rectangle([ (x0, y0 + rad), (x1, y1 - rad) ], fill=fill)
    draw.rectangle([ (x0 + rad, y0), (x1 - rad, y1) ], fill=fill)
    draw.pieslice([ (x0, y0), (x0 + rad * 2, y0 + rad * 2) ], 180, 270, fill=fill)
    draw.pieslice([ (x1 - rad * 2, y1 - rad * 2), (x1, y1) ], 0, 90, fill=fill)
    draw.pieslice([ (x0, y1 - rad * 2), (x0 + rad * 2, y1) ], 90, 180, fill=fill)
    draw.pieslice([ (x1 - rad * 2, y0), (x1, y0 + rad * 2) ], 270, 360, fill=fill)

# Open an image
im = Image.open(INPUT_IMAGE_FILENAME)

# Create rounded rectangle mask
mask = Image.new('L', im.size, 0)
draw = ImageDraw.Draw(mask)
rounded_rectangle(draw, (im.size[0]//4, im.size[1]//4, im.size[0]//4*3, im.size[1]//4*3), rad=40, fill=255)
mask.save('mask.png')

# Blur image
blurred = im.filter(ImageFilter.GaussianBlur(20))

# Paste blurred region and save result
im.paste(blurred, mask=mask)
im.save(OUTPUT_IMAGE_FILENAME)

Исходное изображение:

Can of Coke on a beach (in Ukraine)

Маска:

White rectangle with rounded corners on a black background

Выходное изображение:

Blurred can of Coke on a beach

Протестировано с Python 2.7.12 и Pillow 3.1.2 (в нем нет BoxBlur).

...