如何在不使用patchify的情况下解决sklearn extract_patches属性错误?
解决AttributeError: module 'sklearn.feature_extraction.image' has no attribute 'extract_patches'的问题(不使用patchify库)
sklearn.feature_extraction.image模块确实没有extract_patches方法,以下是两种无需依赖patchify库的图像分块实现方案:
方案一:用Numpy手动实现高效分块
利用Numpy的stride_tricks.as_strided直接操作数组内存 stride,避免数据复制,效率较高:
import numpy as np def extract_patches(image, patch_size, stride): # 输入图像需为 (height, width, channels) 格式的RGB图,灰度图可调整维度 h, w, c = image.shape patch_h, patch_w = patch_size # 计算可生成的patch数量 num_patches_h = (h - patch_h) // stride + 1 num_patches_w = (w - patch_w) // stride + 1 # 通过stride生成子块 patches = np.lib.stride_tricks.as_strided( image, shape=(num_patches_h, num_patches_w, patch_h, patch_w, c), strides=( stride * image.strides[0], stride * image.strides[1], image.strides[0], image.strides[1], image.strides[2] ), writeable=False # 禁止修改原数据,避免内存错误 ) # 展平为 (总patch数, patch_h, patch_w, c) 格式 return patches.reshape(-1, patch_h, patch_w, c) # 示例使用 rgb_image = np.random.rand(256, 256, 3) # 生成随机256x256 RGB图像 patches = extract_patches(rgb_image, patch_size=(64, 64), stride=32) print(patches.shape) # 输出: (49, 64, 64, 3)
如果处理灰度图像(shape为(h, w)),只需修改函数内的维度获取逻辑,比如h, w = image.shape,并调整shape和strides参数即可。
方案二:使用scikit-image的view_as_windows
scikit-image内置的view_as_windows封装了stride操作,用法更简洁:
from skimage.util import view_as_windows import numpy as np # 示例灰度图像 gray_image = np.random.rand(256, 256) patch_size = (64, 64) stride = (32, 32) # 生成patch窗口 patches = view_as_windows(gray_image, window_shape=patch_size, step=stride) # 展平为 (总patch数, patch_h, patch_w) patches = patches.reshape(-1, *patch_size) print(patches.shape) # 输出: (49, 64, 64) # 处理RGB图像示例 rgb_image = np.random.rand(256, 256, 3) rgb_patches = view_as_windows(rgb_image, window_shape=(64, 64, 3), step=(32, 32, 1)) rgb_patches = rgb_patches.reshape(-1, 64, 64, 3)
如果未安装scikit-image,执行pip install scikit-image即可。
注意事项
- 若图像尺寸无法被
(图像尺寸 - patch_size) // stride + 1整除,边缘剩余部分会被忽略,可根据需求提前对图像补零或裁剪处理。 stride_tricks.as_strided生成的是原数组的视图,修改视图会影响原数组,建议设置writeable=False避免意外修改。
内容的提问来源于stack exchange,提问作者QS1
相关产品推荐
相关产品推荐

