异形渐变填充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
中的值范围定义颜色图。
正在寻找一种方法来用值的梯度填充任意形状内的所有值...必须遵循形状的轮廓。例如,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
中的值范围定义颜色图。