更改 Python 中 clear_border 的连接定义

Change connection definitions for clear_border in Python

我一直在使用 scipy 中的 clear_border from scikit-image and label 来识别 1 和 0 的二维数组中相邻像素的区域。我首先使用 clear_border,它删除所有接触边缘的 1 组,然后用 label.

标记剩下的组

我的问题是,使用 label 可以传递自定义 structure 参数。这决定了什么被定义为连接,在我的例子中,它基本上允许我决定对角线是否连接。具体来说,在数组

[[0,0,0,0,0]
 [0,1,0,0,0]
 [0,0,1,1,0]
 [0,0,0,0,0]
 [0,0,0,0,0]
如果 [[0,1,0],[1,1,1],[0,1,0]] 用于 structure

label 将找到 2 个独立对象,但如果使用 [[1,1,1],[1,1,1],[1,1,1]],则只能找到一个。问题是,clear_border 没有这样的选项,当使用 [[1,1,1],[1,1,1],[1,1,1]] 时,它的工作方式与 label 相同(换句话说,clear_border 总是定义要连接的对角线像素)。

所以我的问题只是我需要使用一个与 clear_border 完全一样的函数,但它没有定义要连接的对角线像素。将 structure=[[0,1,0],[1,1,1],[0,1,0]] 传递给 label 的模拟。

更新

根据 Juan 的回答,这是我一直在寻找的一般功能。

from skimage.segmentation import clear_border
from scipy.ndimage.measurements import label

def clear_border_adjacent(matrix):
    """
        clear_border from skimage.segmentation considers diagonal pixels to be connected, 
        so e.g. all structures will be removed in all of these:
                [[0,0,0,0],                [[0,0,0,0],                [[0,0,0,0], 
                 [0,1,1,0],                 [0,1,1,0],                 [0,1,0,0], 
                 [0,0,0,1],                 [0,0,1,1],                 [1,0,0,0],
                 [0,0,0,0]]                 [0,0,0,0]]                 [0,0,0,0]]
        This function clears the border but only considers adjacent pixels connected, 
        so ex 1 and 3 would still have one structure in output but ex 2 would have 0.
    """
    border_cleared = clear_border(label(matrix)[0])
    border_cleared[border_cleared > 0] = 1
    return border_cleared

觉得可以先用label,再用clear border,效果一样吗?如果有原因导致失败,请在 https://github.com/scikit-image/scikit-image/issues

上提出功能请求