当前位置: 首页 > 面试题库 >

内存有效提取矩阵中重叠的补丁

蔚俊人
2023-03-14
问题内容

短篇故事:

这是一个后续问题:将图像切成重叠补丁并将补丁合并到图像的快速方法

我如何适应答案中提供的代码,以使其不仅适用于大小为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提供了目标功能,但由于内存限制而失败,因此不适用。(但对于小补丁大小的给定图像效果很好)
  • 将图像切成重叠色块并将色块合并到图像的快速方法。一个很好的答案似乎是带路的,使用跨步而不是实际创建输入图像的副本。但是,我无法根据我的需要调整答案。

因此,问题是:如何修改此代码以适合新的输入数据?

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)

它很容易被带走,并且想要编写一些更通用的函数,这些函数不需要针对特定​​数组维数进行专门化处理。如果您觉得需要去那里,可以在这个要点中找到一些启发。



 类似资料:
  • 我正在寻找一个有效的解决方案,从矩阵中选择不重叠的值,而不考虑成本的最小化。匈牙利算法通过选择一个代价最小的组合来解决指派问题。然而,我想要一个最大值的最小化。 匈牙利人会选择 总成本=1+2+5=8 但是,最大值为5。 我希望将组合选择为 所以我想要的输出是:4,3,2 而不是成本最小化。我想选择一个最小最大数量的组合。

  • 问题内容: 我是一个新手,我很难理解如何从具有定义的列和行的子矩阵中提取内容: 如果要提取列/行0和3,则应具有: 我尝试了所有重塑功能…但是无法弄清楚该怎么做。有任何想法吗? 问题答案: 给 一试: 这将返回您想要的结果:

  • 我需要点子,这不是家庭作业...... 我有下面的矩阵,我如何获得重复数字的坐标, 重复项[[[0,0],[1,0],[2,0],[0,1],[0,1],[0,2],[1,2],[1,3],[2,2]],[[0,3],[0,4],.........] 第1组,分离2组,分离3组,仅2组 重复项[[[0,0],[1,0],[2,0],[0,1],[0,2],[1,2],[1,3],[2,2]],[[

  • 我有以下代码。当我保存它的时候。列的标题不保存。你能给我指路吗?

  • 假设我们想检查一个矩阵(或数据框)中的哪些行存在于另一个矩阵中。我找到的所有解决方案,这个肯定基本的操作似乎要么需要一个库(这个{data.table} 4-线性),要么是冗长和模糊的,例如: 有人知道一种使用基函数的更优雅的方法,其效率与本例相当吗? 代码无效。

  • 主要内容:对称矩阵,上(下)三角矩阵,稀疏矩阵,矩阵压缩存储的 3 种方式数据结构中,提供针对某些特殊矩阵的压缩存储结构。 这里所说的特殊矩阵,主要分为以下两类: 含有大量相同数据元素的矩阵,比如对称矩阵; 含有大量 0 元素的矩阵,比如稀疏矩阵、上(下)三角矩阵; 针对以上两类矩阵,数据结构的压缩存储思想是:矩阵中的相同数据元素(包括元素 0)只存储一个。 对称矩阵 图 1 对称矩阵示意图 图 1 的矩阵中,数据元素沿主对角线对应相等,这类矩阵称为 对称矩阵。 矩阵中