给定一个N * N的0和1数组,我想构建聚类列表(一个聚类是一组用1标记的连接点)。
scipy.ndimage.label
非常有用,因为它会告诉您哪些点已连接。
但是我还希望在数组上具有周期性边界条件,即,标识点(0,j)
和(N,j)
(就像我粘合成圆柱的平面一样)。因此,我需要告诉scipy.ndimage.label这些要素是通过边界连接的。
例如,如果我的原始数组是:
In[187]: a = [[1, 1, 0, 0, 0, 0, 1, 1],[1, 1, 0, 1, 0, 0, 1, 1],[1, 1, 0, 0, 0, 1, 1, 1]]
labels = measurements.label(a)
print(labels)
Out [187]: (array([[1, 1, 0, 0, 0, 0, 2, 2],
[1, 1, 0, 3, 0, 0, 2, 2],
[1, 1, 0, 0, 0, 2, 2, 2]], dtype=int32), 3)
我想:
(array([[1, 1, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 3, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 1, 1, 1]], dtype=int32), 2)
label的structure参数允许指定连接(例如,即使它们沿对角线接触也已连接的特征),是否也可以用于此目的?
答案 0 :(得分:0)
这里是在左右边界上施加周期性边界条件的示例。右侧的每个标签都用左侧的相应标签标识(如果存在)。
for y in range(label_image.shape[0]):
if label_image[y, 0] > 0 and label_image[y, -1] > 0:
label_image[label_image == label_image[y, -1]] = label_image[y, 0]
您可以对上下边界执行类似的操作。您还可以提出任何其他边界条件,对for
循环中的边界像素进行迭代,并以类似的方式在if
语句中检查条件。