You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从NumPy数组图像中检测并切片提取子图像区域

NumPy宽幅图像子图提取方案

核心逻辑

你的场景下背景值固定为200,中值滤波后仅存在孤立零散噪声,子图为横向排列、纵向铺满全图高度的矩形区域,无需使用复杂的边缘检测算法,基于掩码+连通域去噪+区间检测的方案即可稳定提取子图,适配子图数量不固定、空白间隔不固定的场景。

实现步骤

  • 生成二值前景掩码:将所有像素值不等于200的位置标记为前景,等于200的位置标记为背景,用NumPy向量化运算实现,处理速度极快。
  • 过滤零散噪声:对掩码做连通域检测,剔除面积小于阈值的孤立噪声连通域(你场景下的噪声基本是1-2个像素的孤立点,阈值设为3-10即可完全过滤)。
  • 检测子图横向区间:由于子图纵向铺满全图高度,直接对掩码按列求和,列和大于0代表该列属于子图区域,遍历所有列提取连续非0的列区间,即为每个子图的左右边界。
  • 切片提取子图:对每个检测到的列区间,纵向取全28行、横向取对应列范围做NumPy切片,即可得到独立的子图数组。

可直接复用的代码

import numpy as np
from scipy.ndimage import label, sum as ndi_sum

def extract_subimages(img: np.ndarray, bg_value: int = 200, min_noise_area: int = 3) -> list[np.ndarray]:
    """
    从固定高度为28行的宽幅图像中提取所有子图
    :param img: 输入的原始图像NumPy数组,shape为(28, 列数)
    :param bg_value: 背景像素值,默认为200
    :param min_noise_area: 噪声连通域最小面积阈值,小于该值的连通域会被判定为噪声过滤
    :return: 提取到的子图NumPy数组列表
    """
    # 生成前景掩码
    mask = (img != bg_value).astype(np.uint8)
    # 连通域检测
    labeled_mask, feature_num = label(mask)
    # 计算每个连通域的面积
    feature_areas = ndi_sum(mask, labeled_mask, index=range(1, feature_num + 1))
    # 过滤小面积噪声
    for feat_idx, area in enumerate(feature_areas, start=1):
        if area < min_noise_area:
            mask[labeled_mask == feat_idx] = 0
    # 按列检测是否包含子图内容
    col_contains_content = mask.sum(axis=0) > 0
    # 提取连续的子图列区间
    subimg_intervals = []
    start_col = None
    for col_idx, has_content in enumerate(col_contains_content):
        if has_content and start_col is None:
            start_col = col_idx
        if not has_content and start_col is not None:
            subimg_intervals.append((start_col, col_idx - 1))
            start_col = None
    # 处理最后一个子图延伸到图像右边缘的情况
    if start_col is not None:
        subimg_intervals.append((start_col, col_contains_content.shape[0] - 1))
    # 切片提取所有子图
    subimages = []
    for left_col, right_col in subimg_intervals:
        sub_img = img[:, left_col:right_col + 1]
        subimages.append(sub_img)
    return subimages

方案适配说明

  • 针对你提供的模拟样例,所有零散噪声的连通域面积均为1,设置min_noise_area=2即可完全过滤噪声,准确提取到2个连续子图区域,结果符合预期。
  • 该方案不限制子图数量,无论大图包含1张还是多张子图,只要子图之间存在全背景值的空白列间隔,即可准确拆分,完全适配你28行固定高度、200列固定宽度的真实业务场景。
  • 此前尝试数组切片、边缘检测效果不佳的原因:手动切片依赖提前预知子图位置,泛化性差;常规边缘检测易受噪声和子图内部像素波动干扰,误检率高,本方案基于固定背景值做掩码判断,稳定性远高于通用边缘检测方案。

内容的提问来源于stack exchange,提问作者jscholten

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:12:35