如何解决patchify报错ValueError: `window_shape` is incompatible with `arr_in.shape`
问题原因分析
这个报错的核心是你传入patchify函数的待切分图像的维度,和你指定的切分patch的维度/大小不匹配,常见有两个诱因:
- 你的tif图像读取后带额外的通道维度:你当前指定的patch尺寸是
(256,256),仅适配二维单通道图像,但如果你读取的large_image实际是三维数组(比如格式为(高度, 宽度, 通道数)的RGB图/带通道轴的单通道图),维度数量不匹配就会触发报错。 - 你的原图宽高不是256的整数倍:你设置了patch尺寸和步长都是256,要求原图的高度和宽度都能被256整除,否则最后剩下的不足256的部分无法完成无重叠切分。
解决方案
第一步:确认图像维度
在提取单张图像后先加一行打印代码,确认数组形状:
large_image = large_image_stack[img] print(large_image.shape) # 新增此行查看输出
第二步:对应场景修正
场景1:图像带通道维度
如果打印结果是类似(1024, 1024, 3)的三通道RGB格式,或(1024, 1024, 1)的带多余通道轴的单通道格式,两种修正方式二选一即可:
- 调整patch尺寸匹配维度:3通道图把patchify参数改为
patchify(large_image, (256, 256, 3), step=256);带多余通道的单通道图改为patchify(large_image, (256, 256, 1), step=256) - 提前去除多余维度:单通道图可先执行
large_image = np.squeeze(large_image)去掉长度为1的通道轴,再沿用原来的(256,256)参数即可。
场景2:图像宽高不是256的整数倍
先对原图做边缘填充,把宽高补到256的最小整数倍再切分,单通道图像填充示例:
h, w = large_image.shape # 计算需要填充的像素数,刚好整除时填充量为0 pad_h = (256 - h % 256) % 256 pad_w = (256 - w % 256) % 256 # 默认用0填充边缘,可根据需求修改mode参数调整填充规则 large_image = np.pad(large_image, ((0, pad_h), (0, pad_w)), mode='constant')
带通道的三维图像填充参数对应调整即可:
h, w, c = large_image.shape pad_h = (256 - h % 256) % 256 pad_w = (256 - w % 256) % 256 large_image = np.pad(large_image, ((0, pad_h), (0, pad_w), (0,0)), mode='constant')
掩码的处理逻辑和原图完全一致,按照同样的规则调整即可。
内容的提问来源于stack exchange,提问作者keshari abeysinghe
相关产品推荐
相关产品推荐

