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

如何在28x200的numpy格式大图像中检测28x28尺寸的小图像

解决方案

核心前提说明

OpenCV的所有图像处理API原生支持numpy数组输入,你从.npy文件加载的图像数据本身就是OpenCV可直接处理的格式,不需要额外转成JPG等文件格式,之前查到的JPG相关方案只要跳过文件读取的步骤,直接传入你加载的numpy数组即可使用。

具体实现步骤

  • 第一步:加载.npy格式的图像数据
import numpy as np
import cv2

# 加载npy文件,得到的img就是形状为(28, 200)(灰度图)或(28,200,3)(彩色图)的numpy数组
img = np.load("你的图像文件路径.npy")
# 可选:如果是单通道灰度图可以加这一步确保格式适配
if len(img.shape) == 2:
    img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
  • 第二步:滑动窗口提取28x28候选区域,过滤有效子图
    因为你的大图高度固定为28,和待检测子图高度一致,只需要在宽度方向滑动即可:
h, w = img.shape[:2]
sub_h, sub_w = 28, 28
valid_sub_imgs = []

# 滑动步长可以根据需求调整,这里设为1是完全遍历,设为28是无重叠遍历
for x in range(0, w - sub_w + 1, 1):
    # 提取28x28的子图
    sub_img = img[:, x:x+sub_w]
    # 过滤背景块:判断子图的像素方差/像素和是否高于背景阈值,阈值可以根据你的图像背景调整
    # 例:如果背景是全黑,像素和接近0,有效子图像素和远大于0
    pixel_sum = sub_img.sum()
    if pixel_sum > 1000: # 阈值自己调整到适配你的图像背景
        # 去重:避免相邻滑动窗口得到的重复子图
        if not valid_sub_imgs or x - valid_sub_imgs[-1][1] >= 28:
            valid_sub_imgs.append( (sub_img, x) )
  • 第三步(可选,有明确匹配模板时使用):用OpenCV模板匹配实现更高精度检测
# 加载你的28x28模板,也是numpy数组,可以是从npy加载也可以是其他方式读取
template = np.load("模板文件路径.npy")
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
# 设置匹配阈值,越高匹配精度越高
threshold = 0.8
locations = np.where(res >= threshold)
# 提取所有匹配到的子图位置
for pt in zip(*locations[::-1]):
    matched_sub = img[pt[1]:pt[1]+sub_h, pt[0]:pt[0]+sub_w]
    valid_sub_imgs.append(matched_sub)

结果验证

运行完成后valid_sub_imgs里就是你要的所有28x28有效子图,样例里的3张子图会被全部筛选出来,你可以直接用np.save保存为npy文件,或者用cv2.imwrite保存为图片文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 01:54:06