You need to enable JavaScript to run this app. 如何用Numpy/OpenCV实现指定坐标的255值连通像素总数统计
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 06:15:03