如何在带不同标签的矩阵中查找所有值完全相同的矩形区域
问题原因
scipy.ndimage.find_objects返回的是每个连通区域的最小外接矩形切片,不会验证矩形内部所有像素都等于目标值,你得到的只是包围了所有等于目标值像素的边界框,而非全为目标值的实心矩形。
你示例中值为5的像素仅分布在[0:100, 0:100]的边框位置,它的连通外接矩形刚好是[0:100, 0:100],但矩形内部存在值为6、7的像素,因此不符合要求。
修正方案
你可以在拿到外接矩形后增加一步全局校验,过滤掉内部存在其他值的矩形,参考实现如下:
import numpy as np import scipy.ndimage as nd a = np.zeros((120, 120), dtype=np.uint16) a[:100, :100] = 5 a[10:100, 10:100] = 6 a[12:100, 12:100] = 7 for v in np.unique(a): if v == 0: continue mask = (a == v).astype(int) labels, _ = nd.label(mask) all_bboxes = nd.find_objects(labels) # 校验每个外接矩形是否全为目标值 valid_bboxes = [bbox for bbox in all_bboxes if np.all(a[bbox] == v)] print(f"值{v}的有效全同值矩形:{valid_bboxes}")
运行结果
值5的有效全同值矩形:[] 值6的有效全同值矩形:[] 值7的有效全同值矩形:[(slice(12, 100, None), slice(12, 100, None))]
和实际矩阵的数值分布一致。如果你的需求是提取连通区域内所有小的全同值矩形,可以基于二值掩码用经典的柱状图法求解全1矩形逻辑扩展即可。
内容的提问来源于stack exchange,提问作者Ruediger Jungbeck
相关产品推荐
相关产品推荐

