计算numpy的阵列的周界(Calculate perimeter of numpy array)

2019-07-03 22:23发布

欲计算给定numpy的阵列结构的周边。 与周边我的意思是该结构的numpy的阵列中的确切周边。 该结构可以包括孔。

我目前的aproach是这样的:

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的和基本软件包请。

Answer 1:

你的意思是,在图像中,即从分开红色的瓷砖蓝色长-1条边的总数是多少? 在上面这个数字图像将是28。您在代码得到实施例(其为略有不同,不具有4度角从边界瓦片的其余部分不同)这将是20。

如果这是你要计算的东西,你可以这样做:

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



Answer 2:

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

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如果图像是正确的补零。



文章来源: Calculate perimeter of numpy array