6

我想计算给定 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 和基本包之外,请不要使用其他包。

4

3 回答 3

6

计算内部和边缘的边缘数(假设二值图像):

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。

于 2012-11-18T20:53:36.203 回答
4

你的意思是,在图像中,将蓝色瓷砖与红色瓷砖分开的长度为 1 的边的总数?在上图中,这个数字是 28。在您给出的代码示例中(略有不同,没有 4 个角与其余边框图块不同),它将是 20。

如果这是您想要计算的,您可以执行以下操作:

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

于 2012-11-18T20:53:20.730 回答
0

我添加我的答案是因为现有的有同样的问题:如果一个像素与上面的像素和左边的像素都不同,如果你这样做,它会被计算两次:

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

这是通过使用元素或在进行求和之前修复的:

np.logical_or(
    (a[:,1:] != a[:,:-1])[1:,:], 
    (a[1:,:] != a[:-1,:])[:,1:]).sum()
于 2020-04-06T21:16:37.127 回答