【发布时间】:2017-06-10 12:18:23
【问题描述】:
短篇小说:
这是一个后续问题:Fast Way to slice image into overlapping patches and merge patches to image
我必须如何调整答案中提供的代码,使其不仅适用于大小为 x,y 的图像,其中像素由浮点数描述,但由大小为 3,3 的矩阵描述?
此外,如何调整代码以使其返回一个生成器,允许我迭代所有补丁,而无需将所有补丁保存在内存中?
长篇大论:
给定一个形状为 (x,y) 的图像,其中每个像素由 (3,3) 矩阵描述。这可以描述为形状为 (x,y,3,3) 的矩阵。 进一步给定一个目标补丁大小,例如(11,11),我想从图像(x,y)中提取所有重叠的补丁。
请注意,我不想从矩阵 x,y,3,3 中获取所有补丁,而是从每个像素都是矩阵的图像 x,y 中获取所有补丁。
我希望将这些补丁用于补丁分类算法,有效地迭代所有补丁,提取特征并学习分类器。然而,考虑到巨大的图像和大的补丁大小,没有办法在不损害内存限制的情况下执行此操作。
可能的解决方案:
- sklearn.feature_extraction.image.extract_patches_2d 提供目标函数,但由于内存限制而失败,因此不适用。 (但适用于小补丁大小的给定图像)
- Fast Way to slice image into overlapping patches and merge patches to image。一个很好的答案似乎带路,使用步幅而不是实际创建输入图像的副本。然而,我无法根据自己的需要调整答案。
因此问题是:如何调整这段代码以适应新的输入数据?
def patchify(img, patch_shape):
img = np.ascontiguousarray(img) # won't make a copy if not needed
X, Y = img.shape
x, y = patch_shape
shape = ((X-x+1), (Y-y+1), x, y) # number of patches, patch_shape
# The right strides can be thought by:
# 1) Thinking of `img` as a chunk of memory in C order
# 2) Asking how many items through that chunk of memory are needed when indices
# i,j,k,l are incremented by one
strides = img.itemsize*np.array([Y, 1, Y, 1])
return np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides)
【问题讨论】:
标签: python numpy image-processing matrix slice