【发布时间】:2018-03-19 04:58:36
【问题描述】:
我正在使用 extract_patches_2d 和 extract_patches 从 2d 图像中提取局部补丁,我希望获得解释补丁提取实施方法的理论和参考资料。
【问题讨论】:
标签: python image-processing multidimensional-array scikit-learn data-science
我正在使用 extract_patches_2d 和 extract_patches 从 2d 图像中提取局部补丁,我希望获得解释补丁提取实施方法的理论和参考资料。
【问题讨论】:
标签: python image-processing multidimensional-array scikit-learn data-science
我不确定你指的是什么理论,这些方法实际上只是巧妙的数组操作(剧透:numpy 数组操作)。
第一个 extract_patches_2d 是 extract_patches 上的简单二维包装器,它调用
extract_patches(image,
patch_shape=(p_h, p_w, n_colors),
extraction_step=1)
并重塑结果 (source code)。
第二个 extract_patches 也是一个包装器,这次是在 numpy.as_strided 上。它只准备2*n 形状和大步将工作委托给
as_strided(arr, shape=shape, strides=strides)
这是它的source code。
真正有趣的是numpy.as_strided。从它的文档:
as_strided在给定确切步幅的情况下创建数组视图,并且 形状。这意味着它操纵了内部数据结构 ndarray,如果操作不正确,数组元素可以指向 无效的内存,可能会损坏结果或使您的程序崩溃。它是 建议在计算新时始终使用原始x.strides避免依赖连续的内存布局。
因此,基本上,结果是内存中相同数组的包装器(视图),它提供索引查找,每个索引都在查找x 内的特定区域。 numpy.ndarray.view 是核心 numpy 函数,它允许查看现有数组内部而无需重新分配内存。如果您想深入了解 numpy 如何执行数组操作和视图,numpy internals 是一个不错的起点。
【讨论】: