如何在numpy中有效地提取子阵?

2024-09-24 02:18:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个三维数字阵列图像(宽度,高度和颜色作为维度)。现在我想提取一个给定形状的所有可能的子图像。例如,原始图像的宽度和高度分别为300和200像素,我想提取宽度和高度分别为10和20像素的所有子图像。此外,我希望每个子图像都具有1D数组(为此,我需要指定像素的特定顺序)。

我用以下方法解决问题:

for col0 in range(w_max - max_shift):
    x3s_new = [x + col0 for x in x3s]
    for row0 in range(h_max - max_shift):

        vec_1 = []
        for col_shift, row_shift in px_inds:
            col = col0 + col_shift
            row = row0 + row_shift
            vec_1 += [ia[row, col, 0], ia[row, col, 1], ia[row, col, 2]]

        y3s_new = [y + row0 for y in y3s]
        vec_2 = list(ia[y3s_new, x3s_new, z3s])

在上面的代码中,我对表示图像的“矩阵”的列和行进行循环。然后将每个像素(由其列和行给出)视为子图像的左上角并提取子图像。

vec_1vec_2是作为1D数组(列表)给定的所需子图像。它们是一样的,我只是想测试哪种方式更快。令人惊讶的是,生成vec_2比生成vec_1需要更多的时间。然而,根据我的问题,预计速度会更快。为什么不快点?

最后,我还想知道是否有一种更快的方法可以替代循环遍历图像矩阵的所有列和行。

总而言之,我的问题是:如何更快地达到我的要求?目前,我需要大约5分钟来“处理”一个图像,这是不可接受的为我的目的。


Tags: in图像newforshift宽度高度col