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

如何在不使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:10:32