如何用Numpy/OpenCV实现指定坐标的255值连通像素总数统计
基于Numpy的单连通域像素数统计实现
需求说明
补全输入坐标指定的连通域统计函数:给定图像掩膜mask,输入中心x、y坐标,统计与该坐标处值为255的像素连通的同值像素总个数,若中心位置像素值不是255,直接返回-1。
连通规则与给定测试用例匹配,采用4邻域连通判断(即上下左右相邻的同值像素视为连通,斜向相邻不算连通)。
实现思路
采用广度优先搜索(BFS)遍历目标连通域,核心逻辑完全基于Numpy实现,仅借助双端队列存储待遍历的像素坐标,不依赖OpenCV的连通域接口:
- 初始化与mask同形状的布尔数组,标记已经被统计过的像素,避免重复计数
- 将初始中心像素加入遍历队列,标记为已访问
- 依次从队列取出像素,累计计数,检查该像素上下左右4个邻域位置:若邻域坐标在mask边界内、值为255、且未被访问过,就标记后加入队列
- 队列为空时累计的数值即为连通域总像素数
完整代码实现
import numpy as np from collections import deque def get_area(center_x: int, center_y: int, mask: np.ndarray) -> int: if mask[center_x][center_y] != 255: return -1 # 获取掩膜的行列尺寸 height, width = mask.shape # 初始化访问标记矩阵 visited = np.zeros_like(mask, dtype=bool) # 4邻域坐标偏移量(上下左右) neighbor_offsets = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 初始化遍历队列 traverse_queue = deque() traverse_queue.append((center_x, center_y)) visited[center_x, center_y] = True total_pixels = 0 while traverse_queue: curr_x, curr_y = traverse_queue.popleft() total_pixels += 1 # 检查所有邻域像素 for dx, dy in neighbor_offsets: next_x = curr_x + dx next_y = curr_y + dy # 校验邻域坐标是否在掩膜范围内 if 0 <= next_x < height and 0 <= next_y < width: # 校验邻域是未访问的255值像素 if mask[next_x, next_y] == 255 and not visited[next_x, next_y]: visited[next_x, next_y] = True traverse_queue.append((next_x, next_y)) return total_pixels
测试验证
使用给定的9x9示例掩膜,输入中心坐标(4,4)(行、列索引均从0开始计数),函数返回值为5,和预期输出完全匹配。
可选调整
- 若需要改为8邻域连通规则(斜向相邻也判定为连通),只需在
neighbor_offsets中补充4个斜向偏移量:(-1, -1), (-1, 1), (1, -1), (1, 1) - 可根据需要在函数开头补充中心坐标的边界校验,避免输入坐标超出掩膜范围触发索引异常
内容的提问来源于stack exchange,提问作者SDG
相关产品推荐
相关产品推荐

