gpt4 book ai didi

python - 从矩阵中有效地提取重叠 block

转载 作者:行者123 更新时间:2023-11-30 22:43:11 25 4
gpt4 key购买 nike

短篇小说:

这是以下问题的后续问题:Fast Way to slice image into overlapping patches and merge patches to image

我必须如何调整答案中提供的代码,使其不仅适用于大小为 x,y 的图像(其中像素由 float 描述,而且由大小为 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)

最佳答案

虽然您链接的答案没有错误,但我认为最好不要对数组的步幅做出假设,而只是重用它已有的任何步幅。它的另一个好处是永远不需要原始数组的副本,即使它不连续。对于扩展的图像形状,您可以这样做:

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中找到一些灵感。 .

关于python - 从矩阵中有效地提取重叠 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41849548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com