You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:24:05