测量numpy 2d区域之间的边界重叠

时间:2016-09-21 14:17:29

标签: python arrays numpy multidimensional-array vectorization

我有一个大的numpy 2d(10000,10000),有许多区域(具有相同单元格值的聚类单元格)。我想要的是合并相邻区域,这些区域显示超过35%的边界重叠。应该通过将公共边界的大小除以邻居来计算该重叠,以及该区域的总边界大小。

我知道如何检测邻近区域(https://docs.google.com/spreadsheets/d/1OMq4a4_Gh_xyNk_IRy-mwJn5Hq36RXmdAzTzx7dGii0/edit?usp=sharing),但我不知道如何测量边界重叠。

当我使用大型数组时,矢量化解决方案将是最佳的。

实施例

#input
region_arr=np.array([[1,1,3,3],[1,2,2,3],[2,2,4,4],[5,5,4,4]])

Look here

邻居检测脚本的输出是一个numpy 2-d数组,第一列中的区域和第二列中的邻居。

#result of neighbour detection
>>> region_neighbour=detect_neighbours(region_arr)
>>> region_neighbour
array([[1, 2],
       [1, 3],
       [2, 1],
       [2, 3],
       [2, 4],
       [2, 5],
       [3, 1],
       [3, 2],
       [3, 4],
       [4, 2],
       [4, 3],
       [4, 5],
       [5, 2],
       [5, 4]])

我想在邻居检测的结果中添加一列,其中包含该区域与其邻居之间的百分比重叠。 区域1和3之间的百分比重叠= 1/8 = 0.125 =区域1的公共边界大小/总边界大小。

在此示例中,所需的输出如下所示:

#output
>>> percentual_overlap=measure_border_overlap(region_arr,region_neighbour)
>>> percentual_overlap
array([[ 1.       ,  3.       ,  0.125   ],
       [ 1.       ,  2.       ,  0.375   ],
       [ 2.       ,  1.       ,  0.3     ],
       [ 2.       ,  3.       ,  0.3     ],
       [ 2.       ,  4.       ,  0.2     ],
       [ 2.       ,  5.       ,  0.2     ],
       [ 3.       ,  1.       ,  0.125   ],
       [ 3.       ,  2.       ,  0.25    ],
       [ 3.       ,  4.       ,  0.125   ],
       [ 4.       ,  2.       ,  0.375   ],
       [ 4.       ,  3.       ,  0.125   ],
       [ 4.       ,  5.       ,  0.125   ],
       [ 5.       ,  2.       ,  0.333333],
       [ 5.       ,  4.       ,  0.166667]])       

使用此输出,合并重叠超过35%的区域(区域1和2;区域4和2)相对容易。区域合并后,新阵列将如下所示:

enter image description here

修改

您可以通过应用enter image description here的函数来计算每个区域的周长。

1 个答案:

答案 0 :(得分:1)

看一下这个Count cells of adjacent numpy regions的灵感。根据这些信息决定如何合并是我认为的多个答案的问题;根据您的处理顺序,它可能没有唯一的解决方案......

import numpy_indexed as npi

neighbors = np.concatenate([x[:, :-1].flatten(), x[:, +1:].flatten(), x[+1:, :].flatten(), x[:-1, :].flatten()])
centers   = np.concatenate([x[:, +1:].flatten(), x[:, :-1].flatten(), x[:-1, :].flatten(), x[+1:, :].flatten()])
border = neighbors != centers

(neighbors, centers), counts  = npi.count((neighbors[border], centers[border]))
region_group = group_by(centers)
regions, neighbors_per_region = region_group.sum(counts)
fractions = counts / neighbors_per_region[region_group.inverse]
for result in zip(centers, neighbors, fractions): 
    print(result)