如何在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
相关产品推荐
相关产品推荐

