之前我使用的是圆形图像蒙版,我根据距离圆心的距离来计算重量,如下所示:
import numpy as np
def create_mask(image, radius, center=(0, 0)):
r, c, d = image.shape
x, y = np.ogrid[:r, :c]
distance = np.sqrt((x-center[0])**2 + (y-center[1])**2)
m = distance < radius
distance[m] = 1.0 - distance[m]/radius
array = np.zeros((r, c))
array[m] = distance[m]
return array
这基本上是将高度重量设置在中心,重量线性地向边缘下降。
现在,我想用椭圆做类似的事情。同样,椭圆沿着两个维度可以具有非常不同的半径,并且我希望重量也随着距离线性地下降。然而,无论长半径还是短半径,我都希望权重类似于边缘衰减。我猜我需要在半径的基础上加入一个权重来实现这个目标,但无法弄明白。
答案 0 :(得分:1)
我不确定线性权重,但你可以使用(我确定有更好的方法来实现这一点)来实现从1到0的连续数组权重。
ellipse = lambda x0, y0, r_x, r_y: lambda x, y: ((x - x0) / r_x)**2 + ((y - y0) / r_y)**2
def gen_ellipse(el, lower, upper, step):
coords = np.arange(lower, upper, step)
x, y = np.meshgrid(coords, coords)
mask = el(x, y)
mask[np.where(mask > 1)] = 0
return 1 - mask
例如:
> %pylab
> el = ellipse(0.0, 0.0, 0.3, 0.8)
> mask = gen_ellipse(el, -1.0, 1.0, 0.0025)
> imshow(mask, cmap=get_cmap('Greys'))
黑色为1,白色为0。