0

寻找一种方法来填充任意形状内的所有值的梯度值......它必须遵循形状的轮廓。例如,gimp 中的“渐变形状”填充工具将为您提供:

在此处输入图像描述

输出应该是一个 2d numpy 数组。

4

1 回答 1

1

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

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

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

于 2020-06-04T21:08:26.113 回答