矩阵中相邻相同值的分组大小检测方法问询
检测矩阵中相邻相同值分组大小的简便方法
当然有啦!你说的这个问题其实就是连通域分析的典型场景——把矩阵里相邻(4连通/8连通)的相同值元素归为一组,然后统计每组的大小。下面给你分享几个最简便的实现方式,都是用现成的工具库,不用自己从头写复杂的遍历逻辑~
方法一:用Scipy的ndimage.label(最推荐)
Scipy的ndimage模块专门处理多维数组的形态学操作,label函数可以直接帮你标记所有连通域,再配合np.bincount就能轻松统计每组大小。
代码示例
import numpy as np from scipy.ndimage import label # 先构造一个符合你描述的示例矩阵(模拟有14个相连5的场景) matrix = np.zeros((6, 6)) # 手动构建一片相连的5元素 matrix[0:3, 0:4] = 5 matrix[3, 1:3] = 5 matrix[4, 1:4] = 5 matrix[0, 4] = 5 matrix[1, 4] = 5 # 第一步:针对值为5的区域做连通域标记 # 默认是4连通(上下左右),如果要包含对角线的8连通,加参数:structure=np.ones((3,3)) labeled_matrix, total_groups = label(matrix == 5) # 第二步:统计每个连通域的大小 group_sizes = np.bincount(labeled_matrix.flatten()) # 第三步:获取[0,4]位置对应的分组大小 target_label = labeled_matrix[0, 4] target_group_size = group_sizes[target_label] print(f"[0,4]位置的分组大小:{target_group_size}") # 输出14,和你的例子一致
关键说明
label(matrix == 5)会把所有相连的5标记为同一个整数,不同组标记不同数字np.bincount会统计每个标记出现的次数,也就是对应分组的元素数量- 可以通过
structure参数切换4连通/8连通模式
方法二:用OpenCV的connectedComponentsWithStats
如果你平时处理图像类矩阵比较多,OpenCV的这个函数也很实用,它不仅能返回分组大小,还能给出每个连通域的位置、外接矩形等额外信息。
代码示例
import numpy as np import cv2 # 构造示例矩阵(注意转成OpenCV支持的uint8类型) matrix = np.zeros((6, 6), dtype=np.uint8) matrix[0:3, 0:4] = 5 matrix[3, 1:3] = 5 matrix[4, 1:4] = 5 matrix[0, 4] = 5 matrix[1, 4] = 5 # 生成值为5的二值图像(OpenCV需要黑白二值图作为输入) binary_img = (matrix == 5).astype(np.uint8) * 255 # 执行连通域分析,connectivity=4指定4连通(默认是8连通) num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binary_img, connectivity=4) # stats的第4列是每个连通域的面积(分组大小) target_label = labels[0, 4] target_group_size = stats[target_label, cv2.CC_STAT_AREA] print(f"[0,4]位置的分组大小:{target_group_size}") # 同样输出14
手动实现思路(适合理解原理)
如果想自己写逻辑,用**DFS(深度优先搜索)或BFS(广度优先搜索)**就行:
- 先创建一个和矩阵同大小的
visited矩阵,标记元素是否被处理过 - 遍历矩阵每个元素,若未访问且等于目标值,就开始遍历所有相邻的相同值元素,一边标记已访问一边计数
不过这种方法不如库函数高效,适合学习原理,实际场景还是用上面的工具库更省心~
内容的提问来源于stack exchange,提问作者GSerum_
相关产品推荐
相关产品推荐

