Как размыть эллипс с ImageDraw - PullRequest
2 голосов
/ 11 апреля 2019

Я реализовал алгоритм, который распознает лица, и я хочу размыть лица.Я использую PIL для размытия.

image = Image.open(path_img)
draw = ImageDraw.Draw(image)
draw.ellipse((top, left, bottom, right), fill = 'white', outline ='white')

Я получил это с моим кодом

Лицо для размытия

Я хотел бы использовать:

blurred_image = cropped_image.filter(ImageFilter.GaussianBlur(radius=10 ))

Но я не могу использовать его, потому что я использую ImageDraw, и он работает только с классом Image.Как можно размыть эллипсом (кругом) лицо?

Спасибо

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

размытие эллипса - лучший способ

Для подушки лучший способ сделать это - использовать размытый эллипс в качестве маски смешения для composite.

from PIL import Image, ImageDraw, ImageFilter


def make_ellipse_mask(size, x0, y0, x1, y1, blur_radius):
    img = Image.new("L", size, color=0)
    draw = ImageDraw.Draw(img)
    draw.ellipse((x0, y0, x1, y1), fill=255)
    return img.filter(ImageFilter.GaussianBlur(radius=blur_radius))


kitten_image = Image.open("kitten.jpg")
overlay_image = Image.new("RGB", kitten_image.size, color="orange")  # This could be a bitmap fill too, but let's just make it orange
mask_image = make_ellipse_mask(kitten_image.size, 150, 70, 350, 250, 5)
masked_image = Image.composite(overlay_image, kitten_image, mask_image)
masked_image.show()

Учитывая этого очаровательного котенка в качестве входных данных, на выходе получается

a censored kitten


РЕДАКТИРОВАТЬ: Вдохновленный ответом Марка Сетчелла, простое изменение строки overlay_image на

overlay_image = kitten_image.filter(ImageFilter.GaussianBlur(radius=15))

дает нам этот вариант размытия (с плавными краями для размытия :))

enter image description here


0 голосов
/ 11 апреля 2019

Не уверен, если вы хотите что-то скомбинировать с изображением, чтобы скрыть содержимое или размыть его.Это более размыто: -)

Начиная с Паддингтона:

enter image description here

Вы можете перейти к "Режим невидимости" вот так:

#!/usr/bin/env python3

from PIL import Image, ImageDraw, ImageFilter
import numpy as np

# Open image
im = Image.open('paddington.png')

# Make a mask the same size as the image filled with black
mask = Image.new('RGB',im.size)

# Draw a filled white circle onto the black mask
draw = ImageDraw.Draw(mask)
draw.ellipse([90,40,300,250],fill=(255,255,255))

# Blur the entire image
blurred = im.filter(ImageFilter.GaussianBlur(radius=15))

# Select either the original or the blurred image at each pixel, depending on the mask
res = np.where(np.array(mask)>0,np.array(blurred),np.array(im)) 

# Convert back to PIL Image and save
Image.fromarray(res).save('result.png')

enter image description here


Или, как предлагает @AKX, вы можете удалить зависимость Numpy и сделать коднемного меньше, но все же получить тот же результат:

#!/usr/bin/env python3

from PIL import Image, ImageDraw, ImageFilter
import numpy as np

# Open image
im = Image.open('paddington.png')

# Make a mask the same size as the image filled with black
mask = Image.new('L',im.size)

# Draw a filled white circle onto the black mask
draw = ImageDraw.Draw(mask)
draw.ellipse([90,40,300,250],fill=255)

# Blur the entire image
blurred = im.filter(ImageFilter.GaussianBlur(radius=15))

# Composite blurred image over sharp one within mask
res = Image.composite(blurred, im, mask)

# Save
res.save('result.png')
...