【问题标题】:How to do component labeling of a binary image in python如何在python中对二进制图像进行组件标记
【发布时间】:2019-09-04 21:21:21
【问题描述】:

我试图通过简单数组的轮廓跟踪来应用组件标签作为示例。

arr = np.array([
                [1,0,1,0,0,0,0],
                [1,1,1,0,0,0,0],
                [0,1,1,0,0,0,1],
                [0,1,1,0,0,1,1],
                [0,0,0,0,1,1,1],
                [0,0,0,1,1,1,1],
                [0,0,0,1,1,1,1],
                ])

这表示一个二值图像,0 表示空白,1 表示形状。

我试图得到的结果是分别标记这两个多边形,并通过 matplotlib 在图表中以不同的颜色显示每个多边形(证明多边形中的每个点都已标记到相应的区域。

我认为skimage.measure.regionpropsskimage.measure.labelskimage.measure.find_contours 的组合可以解决问题,但我找不到任何我想要解决的示例。

我花了几个小时试图理解文档并搜索以前的帖子,但现在陷入了死胡同。 This post here似乎与我的问题类似,尽管我希望能够标记形状内部的每个像素,而不仅仅是周长。

非常感谢任何对我应该做的事情的帮助或解释。谢谢

【问题讨论】:

    标签: python scikit-image


    【解决方案1】:

    你只需要使用skimage.measure.label:

    import numpy as np
    from skimage.measure import label
    from skimage import io
    
    arr = np.array([[1,0,1,0,0,0,0],
                    [1,1,1,0,0,0,0],
                    [0,1,1,0,0,0,1],
                    [0,1,1,0,0,1,1],
                    [0,0,0,0,1,1,1],
                    [0,0,0,1,1,1,1],
                    [0,0,0,1,1,1,1]])
    
    img = label(arr)
    io.imshow(img)
    

    In [12]: img
    Out[12]: 
    array([[1, 0, 1, 0, 0, 0, 0],
           [1, 1, 1, 0, 0, 0, 0],
           [0, 1, 1, 0, 0, 0, 2],
           [0, 1, 1, 0, 0, 2, 2],
           [0, 0, 0, 0, 2, 2, 2],
           [0, 0, 0, 2, 2, 2, 2],
           [0, 0, 0, 2, 2, 2, 2]], dtype=int64)
    

    【讨论】:

    • 假设我想引用整个黄色形状并获得黄色形状中所有点的 ndarray。我会为此使用 regionprops 吗?
    • Noy 确定我理解正确,但我认为您可以简单地这样做:yellow = img == 2
    • 让我试着改写一下。假设这是一个大数组(超过 100x100),可以有 5 到 10 个不同的形状被标记。如何从所有标记的形状中找到最大的形状?我是否也可以查询点(x,y) 是否属于最大标签?
    • skimage.measure.regionprops 是你的朋友。如果您发布新问题,我认为您更有可能获得有关如何使用regionprops 解决问题的帮助。
    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多