Python中如何修改scikit-image的clear_border函数的连通性定义
自定义连通规则的边界像素清除实现问题
我一直使用scikit-image的clear_border和scipy的label函数识别由0和1组成的二维数组中的相邻像素区域,操作逻辑是先调用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]]
当structure设为[[0,1,0],[1,1,1],[0,1,0]]时,label会识别出2个独立对象;当structure设为[[1,1,1],[1,1,1],[1,1,1]]时,仅会识别出1个独立对象。但clear_border没有提供类似参数,其默认连通规则和structure为全1矩阵时的label规则一致,也就是clear_border始终将对角像素判定为连通。
我需要一个和clear_border功能完全一致,但不将对角像素判定为连通的函数,等价于给clear_border传入structure=[[0,1,0],[1,1,1],[0,1,0]]的效果,请问该如何实现?
更新
根据Juan的回答,我实现了符合需求的通用函数,代码如下:
from skimage.segmentation import clear_border from scipy.ndimage.measurements import label def clear_border_adjacent(matrix): """ skimage.segmentation自带的clear_border会将对角像素判定为连通,比如以下三个示例中的所有结构都会被移除: [[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]] 本函数仅将上下左右相邻像素判定为连通,执行边界清除后,上述示例1和3的输出仍会保留一个结构,仅示例2的输出无剩余结构。 """ border_cleared = clear_border(label(matrix)[0]) border_cleared[border_cleared > 0] = 1 return border_cleared
内容的提问来源于stack exchange,提问作者Thomas Dewitt
相关产品推荐
相关产品推荐

