6

我想计算给定numpy阵列结构的周长。周长我的意思是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 

enter image description here

正如你可以看到它显示所有相邻的细胞,但是它们的总和不等于补丁的周长。示例数组中的孔计算为1,但它正确地具有4条边。有不同形状的大孔有类似的问题。

我在过去曾问过类似的问题,但都提供了解决方案,但最终无法解决正确的输出值问题。 有人有一个想法如何做到这一点? 请不要包含比numpy,scipy和基础包更多的其他软件包。

+1

在这个例子中你期望什么值? – Eric

+0

一个整数值。在上述测试数据集中,最终值应该是20,因为有20个边。 – Curlew

回答

4

您的意思是,在图像中,将蓝色和红色瓷砖分开的长度为1的边的总数是多少?在上面的图片中,这个数字是28.在代码中给出的例子(略有不同,没有4个角落与其他边框的区别),它将是20.

如果这就是你要计算,你可以这样做:

numpy.sum(a[:,1:] != a[:,:-1]) + numpy.sum(a[1:,:] != a[:-1,:])

+0

图像是生成的数组(b)绘制。 – Curlew

+0

是的,作品!我选择了你的解决方案,因为它更小更快 – Curlew

5

计数在内部及边缘的边数(假定二值图像):

n_interior = abs(diff(a, axis=0)).sum() + abs(diff(a, axis=1)).sum() 
n_boundary = a[0,:].sum() + a[:,0].sum() + a[-1,:].sum() + a[:,-1].sum() 
perimeter = n_interior + n_boundary 

,您可以省去n_boundary如果图像是合适的y零填充。