使用cv2按matplotlib自定义网格标签切分图像并以对应标签命名文件
问题核心原因
你当前的切分代码存在两个不匹配的问题:
- 坐标系差异:matplotlib的坐标原点在图像左下角,y轴向上递增;OpenCV读取的图像数组原点在左上角,y轴向下递增,直接按行从上到下切分的话y轴标签顺序完全颠倒
- 遍历顺序问题:你当前的循环是从图像左上角开始逐行切分,和要求的「从左下角开始向外扩展」的顺序不匹配,文件名偏移量也没有和标签生成规则对齐
修正后可直接运行的代码
import cv2 import os # 固定参数,和你matplotlib侧的配置完全保持一致 GRID_SIZE = 128 X_TAG_OFFSET = 18 Y_TAG_OFFSET = 39 # 读取原图,创建输出文件夹(已存在则跳过不报错) img = cv2.imread("sunset.png") os.makedirs("split", exist_ok=True) img_h, img_w = img.shape[:2] # 计算横、纵向的网格总数量,逻辑和matplotlib侧完全对齐 nx = int(img_w / GRID_SIZE) ny = int(img_h / GRID_SIZE) # 遍历顺序严格匹配标签生成规则:从最底部一行开始,从左到右切分,逐行向上 for j in range(ny): # 计算当前j对应的OpenCV行坐标范围(修正y轴方向差) r_start = img_h - (j + 1) * GRID_SIZE r_end = r_start + GRID_SIZE for i in range(nx): c_start = i * GRID_SIZE c_end = c_start + GRID_SIZE # 裁剪当前网格 grid = img[r_start:r_end, c_start:c_end, :] # 文件名完全匹配标签命名规则 save_path = f"split/{i + X_TAG_OFFSET}_{j + Y_TAG_OFFSET}.png" cv2.imwrite(save_path, grid)
逻辑验证点
- 左下角第一个切出的网格文件名为
18_39.png,同一行向右依次为19_39.png、20_39.png,完全符合你的命名要求 - 向上一行的第一个网格文件名为
18_40.png,和标签生成逻辑里j+39的规则完全对应 - 切分的每个网格尺寸为128×128px,和你设置的网格间隔完全一致
内容的提问来源于stack exchange,提问作者ext32
相关产品推荐
相关产品推荐

