更改 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
上提出功能请求
我一直在使用 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
上提出功能请求