如何为二维NumPy数组生成掩码:筛选非孤立的大于0.5的元素
生成二维NumPy数组的非孤立高值元素掩码
给定二维NumPy数组,需生成掩码仅保留大于0.5且非孤立的元素:非孤立指元素的邻域(边缘元素有3/5个邻域,中心元素有8个邻域)中至少存在一个大于0.5的元素,排除所有邻域均小于0.5的孤立高值元素。
示例数组
import numpy as np # 示例数组 a = np.array([ [0.92576936, 0.41860519, 0.26446948, 0.31691141], [0.31797497, 0.2044637 , 0.20939504, 0.54034017], [0.85781227, 0.40367301, 0.40215265, 0.95902499], [0.15700837, 0.10680368, 0.61971475, 0.35586694], [0.25211967, 0.98171005, 0.60740472, 0.89452886] ])
高效实现方案
利用NumPy结合形态学膨胀操作,无需手动遍历邻域,简洁高效:
from scipy.ndimage import binary_dilation # 1. 生成初始掩码:标记所有大于0.5的元素 mask_high = a > 0.5 # 2. 定义8邻域结构元(覆盖所有相邻位置) structuring_element = np.array([[1,1,1], [1,0,1], [1,1,1]]) # 3. 对初始掩码做膨胀操作:得到所有邻域(含自身)有高值的位置 mask_neighbor_high = binary_dilation(mask_high, structure=structuring_element) # 4. 最终掩码:自身是高值,且邻域至少有一个高值(即非孤立) final_mask = mask_high & mask_neighbor_high print(final_mask)
输出结果
array([[False, False, False, False], [False, False, False, True], [False, False, False, True], [False, False, True, False], [False, True, True, True]])
原理说明
mask_high:筛选出所有自身大于0.5的元素binary_dilation:将每个高值元素的8邻域标记为True,mask_neighbor_high中为True的位置,要么自身是高值,要么邻域有高值- 两者取交集(
&):仅保留自身是高值,同时邻域存在高值的元素,完全符合需求
内容的提问来源于stack exchange,提问作者Cheng
相关产品推荐
相关产品推荐

