我想计算一个给定的numpy数组结构的周长。在numpy数组中,周长是指结构的确切周长。该结构可以包括孔。
我目前的做法是这样的:
import numpy
a = numpy.zeros((6,6), dtype=numpy.int)
a[1:5, 1:5] = 1;a[3,3] = 0
# Way 1
s = ndimage.generate_binary_structure(2,1)
c = ndimage.binary_dilation(a,s).astype(a.dtype)
b = c - a
numpy.sum(b) # The result, however the hole is calculated as 1, although there are 4 edges
# Way 2
b = ndimage.distance_transform_cdt(a == 0,metric='taxicab') == 1
b = b.astype(int)
numpy.sum(b) # same as above
正如你所看到的,它显示了所有相邻的单元格,但是它们的总和不等于面片的周长。示例阵列中的孔被计算为1,尽管它正确地具有4条边。不同形状的较大孔也存在类似的问题。
我以前也问过类似的问题,但所有的问题都提供了解决方案,但最终都没有得到正确的输出值。有人知道如何做到这一点吗?除了numpy,scipy和基本包之外,没有其他包。
3条答案
按热度按时间qhhrdooz1#
计算内部和边缘处的边缘数(假设二进制图像):
如果图像被正确地填充了零,则可以省略n_boundary。
ssm49v7z2#
你的意思是,在图像中,长度为1的边的总数,将蓝色和红色的瓷砖分开?在上面的图片中,这个数字是28。在代码中给予的示例中(略有不同,没有4个角与其余的边界瓷砖不同),它将是20。
如果这就是你想要计算的,你可以做如下的事情:
numpy.sum(a[:,1:] != a[:,:-1]) + numpy.sum(a[1:,:] != a[:-1,:])
mfuanj7w3#
我添加我的答案是因为现有的有同样的问题:如果一个像素与上面的像素和左边的像素都不同,那么它会被计算两次:
这是通过使用元素或在求和之前固定的: