计算 Python 中两个独立几何体的面积
Calculate the area of two separate geometries in Python
我被这个问题困扰了一段时间,想知道是否有人能提供帮助。假设我有一个如下所示的二进制图像,我想计算黑色元素 (zero
)。问题是我想分别知道中间的'background'和'trapezoid'关联的元素个数,所以输出两个值。解决这个问题最简单的方法是什么?我一直在尝试不使用 mask
来做到这一点,但这有可能吗?如果有帮助,我有 numpy
和 scipy
库。
您可以使用 scipy.ndimage.measurements
中的两个函数:label
和 find_objects
。
首先反转数组,因为 label
函数将零视为背景。
inverted = 1 - binary_image_array
然后你调用label
来查找不同的区域:
labeled_array, num_features = scipy.ndimage.measurements.label(inverted)
所以,对于这个特定的数组,你已经知道那里恰好有两个黑色斑点,你有两个区域labeled_array
.
显然,scipy 方法是一个很好的答案。
我在想你也许可以使用 numpy.cumsum
和 numpy.diff
来找到一个封闭区域。
当你在黑色区域时,累计和为零,然后在白色区域每像素增加一,遍历封闭区域时再次稳定,然后再次开始增加,等等
然后二阶差分找到发生跳跃的地方,剩下 "classified" 地图。不能保证这会概括,只是一个想法。
a = numpy.zeros((10,10))
a[3:7,3:7] = 1
a[4:6, 4:6] = 0
y = numpy.cumsum(a, axis=0)
x = numpy.cumsum(a, axis=1)
yy= numpy.diff(y, n=2, axis=0)
xx = numpy.diff(x, n=2, axis=1)
numpy.dot(xx,yy)
array([[ 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., 2., 2., 2., 2., 0., 0., 0.],
[ 0., 0., 0., 2., 4., 4., 2., 0., 0., 0.],
[ 0., 0., 0., 2., 4., 4., 2., 0., 0., 0.],
[ 0., 0., 0., 2., 2., 2., 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.]])
我被这个问题困扰了一段时间,想知道是否有人能提供帮助。假设我有一个如下所示的二进制图像,我想计算黑色元素 (zero
)。问题是我想分别知道中间的'background'和'trapezoid'关联的元素个数,所以输出两个值。解决这个问题最简单的方法是什么?我一直在尝试不使用 mask
来做到这一点,但这有可能吗?如果有帮助,我有 numpy
和 scipy
库。
您可以使用 scipy.ndimage.measurements
中的两个函数:label
和 find_objects
。
首先反转数组,因为 label
函数将零视为背景。
inverted = 1 - binary_image_array
然后你调用label
来查找不同的区域:
labeled_array, num_features = scipy.ndimage.measurements.label(inverted)
所以,对于这个特定的数组,你已经知道那里恰好有两个黑色斑点,你有两个区域labeled_array
.
显然,scipy 方法是一个很好的答案。
我在想你也许可以使用 numpy.cumsum
和 numpy.diff
来找到一个封闭区域。
当你在黑色区域时,累计和为零,然后在白色区域每像素增加一,遍历封闭区域时再次稳定,然后再次开始增加,等等
然后二阶差分找到发生跳跃的地方,剩下 "classified" 地图。不能保证这会概括,只是一个想法。
a = numpy.zeros((10,10))
a[3:7,3:7] = 1
a[4:6, 4:6] = 0
y = numpy.cumsum(a, axis=0)
x = numpy.cumsum(a, axis=1)
yy= numpy.diff(y, n=2, axis=0)
xx = numpy.diff(x, n=2, axis=1)
numpy.dot(xx,yy)
array([[ 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., 2., 2., 2., 2., 0., 0., 0.],
[ 0., 0., 0., 2., 4., 4., 2., 0., 0., 0.],
[ 0., 0., 0., 2., 4., 4., 2., 0., 0., 0.],
[ 0., 0., 0., 2., 2., 2., 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.]])