使用Pillow在图片上添加羽化边缘

4
我正在尝试使用Python的Pillow库找出如何给一张图片的边缘添加羽化效果。
我需要的效果类似于这张可爱的猫咪图片(请忽略可见的边缘):enter image description here 我已经尝试过 im.filter(ImageFilter.BLUR),但并不是我想要的效果。
2个回答

7

看一下这个例子:

from PIL import Image
from PIL import ImageFilter

RADIUS = 10

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

# Paste image on white background
diam = 2*RADIUS
back = Image.new('RGB', (im.size[0]+diam, im.size[1]+diam), (255,255,255))
back.paste(im, (RADIUS, RADIUS))

# Create blur mask
mask = Image.new('L', (im.size[0]+diam, im.size[1]+diam), 255)
blck = Image.new('L', (im.size[0]-diam, im.size[1]-diam), 0)
mask.paste(blck, (diam, diam)) 

# Blur image and paste blurred edge according to mask
blur = back.filter(ImageFilter.GaussianBlur(RADIUS/2))
back.paste(blur, mask=mask)
back.save(OUTPUT_IMAGE_FILENAME)

原始图片(作者 - Irene Mei):

小猫咪

贴在白色背景上的图片:

贴在白色背景上的小猫咪

模糊区域(贴图掩模):

模糊区域

结果:

带有羽化(模糊)边缘的小猫咪图片


注意:通过向粘贴蒙版添加渐变可以改善结果。 - Andriy Makukha
您的代码运行完美。您能否演示如何将渐变应用于蒙版(使羽化边缘的开始不那么明显)? - Crickets
@Crickets,请看下面的答案。 - Andriy Makukha
@AndriyMakukha 我在 https://stackoverflow.com/questions/63016750/how-can-i-feather-an-image-horizontally-using-python 提出了一个相关的问题,你能看一下吗?谢谢。 - Rob

4
提供修改后的解决方案,使用渐变贴图掩模(根据@Crickets的要求)。
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFilter

RADIUS = 10

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

# Paste image on white background
diam = 2*RADIUS
back = Image.new('RGB', (im.size[0]+diam, im.size[1]+diam), (255,255,255))
back.paste(im, (RADIUS, RADIUS))

# Create paste mask
mask = Image.new('L', back.size, 0)
draw = ImageDraw.Draw(mask)
x0, y0 = 0, 0
x1, y1 = back.size
for d in range(diam+RADIUS):
    x1, y1 = x1-1, y1-1
    alpha = 255 if d<RADIUS else int(255*(diam+RADIUS-d)/diam)
    draw.rectangle([x0, y0, x1, y1], outline=alpha)
    x0, y0 = x0+1, y0+1

# Blur image and paste blurred edge according to mask
blur = back.filter(ImageFilter.GaussianBlur(RADIUS/2))
back.paste(blur, mask=mask)
back.save(OUTPUT_IMAGE_FILENAME)

粘贴蒙版:

模糊的黑色矩形

结果:

猫的羽化肖像


非常好。谢谢! - Crickets
可以将图片模糊到透明而不是白色吗?我们是否可以在不增加图像宽度和高度的情况下实现?类似于这个链接:http://www.imagemagick.org/Usage/blur/#feathering - pablo
@Pablo,你可以尝试创建透明背景而不是白色。 - Andriy Makukha
@AndriyMakukha 我看不出这些图片有什么区别。哪些部分是羽化的? - mLstudent33
1
@mLstudent33,请看图片的底部。在第一张图片中,您可以清楚地看到照片模糊部分和原始部分之间的边界。在第二张图片中,边界本身也是模糊的。 - Andriy Makukha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接