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

使用patchify库分割图像遇窗口形状兼容错误及循环疑问求解

问题解决:patchify库图像分块报错与遍历方法

错误根源

你用cv2.imread读取的图像是三维数组(形状为(高度, 宽度, 通道数),你的图像实际形状为(408, 612, 3)),但调用patchify时只传入了二维的窗口形状(306,204),维度不匹配导致报错。


一、合适窗口形状的选择规则

  • 维度匹配:窗口形状的维度必须和输入数组的维度完全一致。比如彩色图像是三维(H,W,C),窗口形状就得是(h, w, c),其中c和原图像通道数相同(一般为3)。
  • 无重叠分割规则:若要无重叠分块,窗口的每个维度大小必须是原图像对应维度的约数。比如原图像高度408,窗口高度选204(408的约数),宽度612选306(612的约数),这样刚好能完整分割。
  • 重叠分割规则:如果需要重叠分块,需满足(原维度大小 - 窗口维度大小) % 步长 == 0,确保所有区域都能被覆盖。

二、修正后的代码与遍历方法

以下是适配你的图像的完整代码,同时解决遍历问题:

import numpy as np
from patchify import patchify
from PIL import Image
import cv2

# 读取图像并确认形状
ocean = cv2.imread("ocean.jpg")
print("原图像形状:", ocean.shape)  # 输出应为 (408, 612, 3)

# 定义窗口形状(H=204, W=306, C=3),步长设为窗口大小(无重叠分割)
patches = patchify(ocean, (204, 306, 3), step=(204, 306, 3))
print("分块后形状:", patches.shape)  # 输出应为 (2, 2, 1, 204, 306, 3)

# 遍历所有分块
patch_count = 0
for i in range(patches.shape[0]):
    for j in range(patches.shape[1]):
        # 取出对应分块(注意第三个维度是1,需取[0])
        patch = patches[i, j, 0]
        # cv2读取的是BGR格式,转RGB后再用PIL保存
        patch_img = Image.fromarray(cv2.cvtColor(patch, cv2.COLOR_BGR2RGB))
        patch_img.save(f"patch_{patch_count}.jpg")
        patch_count += 1

遍历说明:

patchify返回的分块数组形状为(n_h, n_w, 1, h, w, c),其中:

  • n_h:高度方向的分块数(这里是408/204=2)
  • n_w:宽度方向的分块数(这里是612/306=2)
  • 第三个维度固定为1,是patchify的格式要求,所以取patches[i,j,0]才能得到真正的分块数据。
  • 遍历i和j即可覆盖所有分块,无需额外外层循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:15:26