计算 Python 中两个独立几何体的面积

Calculate the area of two separate geometries in Python

我被这个问题困扰了一段时间,想知道是否有人能提供帮助。假设我有一个如下所示的二进制图像,我想计算黑色元素 (zero)。问题是我想分别知道中间的'background'和'trapezoid'关联的元素个数,所以输出两个值。解决这个问题最简单的方法是什么?我一直在尝试不使用 mask 来做到这一点,但这有可能吗?如果有帮助,我有 numpyscipy 库。

您可以使用 scipy.ndimage.measurements 中的两个函数:labelfind_objects

首先反转数组,因为 label 函数将零视为背景。

inverted = 1 - binary_image_array

然后你调用label来查找不同的区域:

labeled_array, num_features = scipy.ndimage.measurements.label(inverted)

所以,对于这个特定的数组,你已经知道那里恰好有两个黑色斑点,你有两个区域labeled_array.

显然,scipy 方法是一个很好的答案。

我在想你也许可以使用 numpy.cumsumnumpy.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.]])