【问题标题】:Calculate the area of two separate geometries in Python在 Python 中计算两个独立几何图形的面积
【发布时间】:2016-08-16 13:06:48
【问题描述】:

我已经被这个问题难住了一段时间,想知道是否有人可以提供帮助。所以假设我有一个如下所示的二进制图像,我想计算黑色元素(zero)。问题是我想知道分别与中间的“背景”和“梯形”相关的元素的数量,所以输出两个值。解决这个问题的最简单方法是什么?我一直试图在不使用mask 的情况下做到这一点,但这可能吗?如果有帮助,我有 numpyscipy 库。

【问题讨论】:

  • 手工制作的 numpy 解决方案将取决于对区域形状/数量的假设...

标签: python image-processing area zero


【解决方案1】:

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

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

inverted = 1 - binary_image_array

然后你拨打label查找不同的地区:

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

因此,对于这个特定的数组,您已经知道恰好有两个黑色斑点,您在labeled_array 中有两个区域。

【讨论】:

  • 那么如何访问每个 blob 的大小?我会使用find_objects吗?
  • 你可以使用这样的东西:count = labeled_array[labeled_array == label_number].astype(int).sum()。这将创建一个布尔数组,将其转换为 int,并对每次出现求和。
【解决方案2】:

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

我在想你也许可以和numpy.cumsumnumpy.diff 一起找到一个封闭的区域。

当您在黑色区域时,累积和将为零,然后在白色区域中每像素增加一,在您遍历封闭区域时再次稳定,然后再次开始增加,等等。

然后,二阶差分会找到发生跳跃的位置,并为您留下一张“分类”的地图。不能保证这是一概而论,只是一个想法。

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.]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2018-09-28
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多