PIL图像上的羽毛边缘

时间:2016-01-07 12:11:04

标签: python image image-processing python-imaging-library pillow

如何使用枕头创建羽毛边缘效果? 羽毛边缘的意思是边缘以与背景淡化的方式柔化,看起来更像下面的图像:this example

我尝试使用:

模糊
im.filter(ImageFilter.BLUR)

但边缘保持清晰。

1 个答案:

答案 0 :(得分:4)

我不确定你想要的是模糊图像。我的印象是你描述的是图像对图像边缘变得越来越透明。您可以通过创建和操作 alpha 频道来调整透明度。由于您使用的是Python,以下是使用Python,numpy和scikit-image的宇航员图像的示例。 alpha通道在中心定义为常量(无透明度),边缘为零(透明),中间为线性渐变。您可以调整Alpha通道,以便在无透明度和完全透明度之间实现更平滑的过渡。

import numpy as np
from skimage import data

astro = data.astronaut()
l_row, l_col, nb_channel = astro.shape
rows, cols = np.mgrid[:l_row, :l_col]
radius = np.sqrt((rows - l_row/2)**2 + (cols - l_col/2)**2)
alpha_channel = np.zeros((l_row, l_col))
r_min, r_max = 1./3 * radius.max(), 0.8 * radius.max()
alpha_channel[radius < r_min] = 1
alpha_channel[radius > r_max] = 0
gradient_zone = np.logical_and(radius >= r_min, radius <= r_max)
alpha_channel[gradient_zone] = (r_max - radius[gradient_zone])/(r_max - r_min)
alpha_channel *= 255
feathered = np.empty((l_row, l_col, nb_channel + 1), dtype=np.uint8)
feathered[..., :3] = astro[:]
feathered[..., -1] = alpha_channel[:]

import matplotlib.pyplot as plt
plt.imshow(feathered)
plt.show()

Astronaut image with transparency at the edge