短篇小说:
这是一个跟进问题: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获取每个像素为矩阵的补丁。
我希望将这些补丁用于补丁分类算法,有效地迭代所有补丁,提取特征并学习分类器。然而,如果给出巨大的图像和大的补丁大小,则无法在不损害内存限制的情况下执行此操作。
可能的解决方案:
因此问题是:如何调整此代码以适应新的输入数据?
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)
答案 0 :(得分:3)
虽然您链接的答案并不正确,但我认为最好不要对数组的步幅做出假设,只是重用它已有的任何步幅。它具有额外的好处,即不需要原始数组的副本,即使它不是连续的。对于扩展图像形状,您可以这样做:
def patchify(img, patch_shape):
X, Y, a, b = img.shape
x, y = patch_shape
shape = (X - x + 1, Y - y + 1, x, y, a, b)
X_str, Y_str, a_str, b_str = img.strides
strides = (X_str, Y_str, X_str, Y_str, a_str, b_str)
return np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides)
很容易被带走,并且想要编写一些更通用的功能,这些功能不需要特定阵列维度的专业化。如果你觉得有必要去那里,你可能会在this gist找到一些灵感。