通过累加像素重新缩放矩阵

时间:2019-02-07 09:46:11

标签: python numpy matrix resize

是否有一种通过简单地添加相邻像素来重新缩放矩阵的快速方法?

因此,对于X=N*M矩阵,您得到一个Y=(N/n) *(N/m),其中n * m是我应在其中添加像素的区域。

我一直在手动执行此操作(通过脚本),但我认为必须有某种方法可以做到这一点。

for i in range(0, X.shape[0]/n):
    for j in range(0, X.shape[1]/m):
        Y[i, j] = np.sum(X[i*n:i*n+n, j*m:j*m+m])

E.G。

X = [[0 1 2 3]
     [2 3 4 5]
     [3 4 6 8]
     [2 3 4 5]]

Y = [[ 6 14]
     [12 23]]

2 个答案:

答案 0 :(得分:2)

一种纯粹的numpy方法是将矩阵重塑为更多的轴并在适当的轴上求和。

Y = X.reshape(X.shape[0]/n, n, X.shape[1]/m, m).sum((1, 3))

答案 1 :(得分:1)

您可以使用函数skimage.utils.view_as_blocksnumpy.sum对代码进行矢量化处理:

import numpy as np
from skimage.util import view_as_blocks

N, M = 4, 4
n, m = 2, 2

X = np.random.randint(size=(N, M), low=0, high=10)
blocks = view_as_blocks(X, (N//n, M//n))
Y = np.sum(blocks, axis=(-1, -2))

NM必须分别是nm的整数倍。否则,您将收到以下错误:

  

ValueError:block_shapearr_in不兼容

样品运行

In [74]: X
Out[74]: 
array([[5, 6, 3, 7],
       [5, 0, 3, 0],
       [6, 1, 8, 0],
       [4, 0, 7, 2]])

In [75]: Y
Out[75]: 
array([[16, 13],
       [11, 17]])