如何在scipy.ndimage中对已标记特征按指定结构进行扩张
解决方案
你要的功能可以通过scipy.ndimage.binary_dilation配合掩码逻辑实现,核心思路是先提取目标标签的区域做膨胀,再只把膨胀后落在背景区域的部分赋值为目标标签,避免覆盖其他已标记的特征。
完整可运行代码如下:
import numpy as np from scipy import ndimage # 你的原有逻辑 a = np.full((8, 8), 1) a[2, :] = a[5, :] = 0 a[:, 2] = a[:, 5] = 0 s = [ [0, 1, 0], [1, 1, 1], [0, 1, 0], ] labeled, num = ndimage.label(a, structure=s) # 标签扩张实现 target_label = 2 # 1. 提取目标标签的二值掩码 target_mask = labeled == target_label # 2. 对目标掩码做膨胀,structure用你自定义的结构元,iterations控制扩张次数 dilated_mask = ndimage.binary_dilation(target_mask, structure=s, iterations=1) # 3. 仅将膨胀后落在原背景(值为0)的区域替换为目标标签,不覆盖其他已有标签 grown = labeled.copy() grown[np.logical_and(dilated_mask, labeled == 0)] = target_label # 打印结果 print(grown)
运行输出和你期望的效果完全一致:
[[1 1 2 2 2 2 3 3] [1 1 2 2 2 2 3 3] [0 0 0 2 2 0 0 0] [4 4 0 5 5 0 6 6] [4 4 0 5 5 0 6 6] [0 0 0 0 0 0 0 0] [7 7 0 8 8 0 9 9] [7 7 0 8 8 0 9 9]]
补充说明:
- 调整
iterations参数可以控制扩张步数,值越大扩张范围越大 - 如果需要同时扩张多个标签,可以按优先级从高到低依次执行上述逻辑,避免低优先级标签覆盖高优先级标签的区域
- 该方法天然支持n维数组,只需保证结构元的维度和输入数组维度一致即可正常工作
内容的提问来源于stack exchange,提问作者nieswand
相关产品推荐
相关产品推荐

