异形渐变填充numpy/scipy

Shaped gradient fill in numpy/scipy

正在寻找一种方法来用值的梯度填充任意形状内的所有值...必须遵循形状的轮廓。例如,gimp 中的 "shaped gradient" 填充工具将为您提供:

输出应该是一个二维 numpy 数组。

你可以看看scipy.ndimage.morphology.distance_transform_edt。这将 return 到最近背景像素的距离。

首先,您需要创建任意形状的二进制图像

import numpy as np
from scipy.ndimage.morphology import distance_transform_edt

# create dummy image
a = np.arange(100).reshape([10, 10])

# use threshold to define arbitrary shape
b = (a > 54).astype('uint8')
print(b)

[[0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1 1 1]]

然后,对二值图像应用距离变换。输出将如下所示,较小的值对应于靠近二进制对象边缘的值。

# apply Euclidean distance transform
d = distance_transform_edt(b)
print(d.round(2))

[[0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]
 [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]
 [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]
 [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]
 [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]
 [0.   0.   0.   0.   0.   1.   1.   1.   1.   1.  ]
 [1.   1.   1.   1.   1.   1.41 2.   2.   2.   2.  ]
 [2.   2.   2.   2.   2.   2.24 2.83 3.   3.   3.  ]
 [3.   3.   3.   3.   3.   3.16 3.61 4.   4.   4.  ]
 [4.   4.   4.   4.   4.   4.12 4.47 5.   5.   5.  ]]

然后可以为 d 中的值范围定义颜色图。