多维数组/准图像的连通分量标记

问题

我正在尝试对超过 3 维的数组执行 connected component labling。我的意思是我的布尔数组有一个 .shape 例如像 (5,2,3,6,10),这将是 5 个维度。

对于 2D 图像(而不是我的 >3D 问题),连接组件标签会将标签放置到连接区域(在我的情况下为超体积)。如果两个 (hpyer-) 像素彼此相邻并且在布尔数组中都为 True,则连接两个 (hpyer-) 像素。

多维数组/准图像的连通分量标记

多维数组/准图像的连通分量标记

我已经尝试过的

对于 2 个维度,此 can be done with OpenCV 和最多 3 个维度,这可以通过 scikit-image's skimage.measure.label 完成。但是,我不确定如何处理我的情况。


为感兴趣的读者提供更多材料(但这对我的问题没有帮助):

wowkrad 回答:多维数组/准图像的连通分量标记

如果 2D 中的 4-connectivity 就足够了,您可以使用最近邻树在 n log n 时间内获得也是前景的相邻像素。 然后是构建图并找到连接组件(也是 n log n,IIRC)。

#!/usr/bin/env python
"""
https://stackoverflow.com/questions/66724201/connected-component-labling-for-arrays-quasi-images-with-many-dimension
"""
import numpy as np
import networkx as nx

from scipy.spatial import cKDTree


def get_components(boolean_array):
    # find neighbours
    coordinates = list(zip(*np.where(boolean_array)))
    tree = cKDTree(coordinates)
    neighbours_by_pixel = tree.query_ball_tree(tree,r=1,p=1) # p=1 -> Manhatten distance; r=1 -> what would be 4-connectivity in 2D

    # create graph and find components
    G = nx.Graph()
    for ii,neighbours in enumerate(neighbours_by_pixel):
        if len(neighbours) > 1:
            G.add_edges_from([(ii,jj) for jj in neighbours[1:]]) # skip first neighbour as that is a self-loop
    components = nx.connected_components(G)

    # create output image
    output = np.zeros_like(data,dtype=np.int)
    for ii,component in enumerate(components):
        for idx in component:
            output[coordinates[idx]] = ii+1

    return output


if __name__ == '__main__':

    shape = (5,2,3,6,10)
    D = len(shape)
    data = np.random.rand(*shape) < 0.1
    output = get_components(data)

对于形状为 (50,50,50) 的数组,我在笔记本电脑上得到以下时间:

In [48]: %timeit output = get_components(data)
5.85 s ± 279 ms per loop (mean ± std. dev. of 7 runs,1 loop each)
,

scipy.ndimage.label 直接做你想做的事:

In [1]: import numpy as np
In [2]: arr = np.random.random((5,10)) > 0.5
In [3]: from scipy import ndimage as ndi
In [4]: labeled,n = ndi.label(arr)
In [5]: n
Out[5]: 11
本文链接:https://www.f2er.com/723559.html

大家都在问