创建具有线性渐变的图像遮罩

Creating an image mask with a linear gradient

我正在 python 中创建一个圆形遮罩,如下所示:

import numpy as np
def make_mask(image, radius, center=(0, 0)):
    r, c, d = image.shape
    y, x = np.ogrid[-center[0]:r-center[0], -center[1]:r-center[1]]
    mask = x*x + y*y <= radius*radius
    array = np.zeros((r, c))
    array[mask] = 1
    return array

这个 returns 形状为 (r, c) 的面具。我想要做的是有一个加权蒙版,其中图像中心的权重为 1(由中心参数给定)并向图像边缘线性减小。因此,他应该是在该行中在 0 和 1(不包括 0)之间计算的附加权重。我在想这应该是这样的:

distance = (center[0] - x)**2 + (center[1] - y)**2
# weigh it inversely to distance from center
mask = (x*x + y*y) * 1.0/distance

但是,这将导致除以 0,掩码也不会介于 0 和 1 之间。

首先,如果你想权重是线性,你需要对你所拥有的距离(即你所说的"distance" 不是到中心的距离而是它的平方,所以你应该将它重命名为 R_squared 之类的东西。所以:

R_squared = (center[0] - x)**2 + (center[1] - y)**2  # what you have for distance
r = sqrt(R_squared)

然后,因为它从 0 开始,您希望它成为 1,所以向它添加 1;但现在您已经添加了 1 缩放值,因此它是 1 您希望结果为 0 的位置。假设你希望它 0 距离中心 L,那么你的等式是:

weight = 1 - r/L

这将是 1 其中 r==00 其中 r==L.