2017-02-26 95 views
6

给定一个2D(M×N)矩阵和一个2D Kernel(K×L),如何返回一个矩阵,该矩阵是max或mean使用给定的内核在图像上汇集?如何使用numpy在二维数组上执行最大值/平均值汇集

如果可能,我想使用numpy。注:M,N,K,L既可以是偶数也可以是奇数,它们不需要彼此完全可分,例如:7x5矩阵和2x2内核。

如最大池的:

matrix: 
array([[ 20, 200, -5, 23], 
     [ -13, 134, 119, 100], 
     [ 120, 32, 49, 25], 
     [-120, 12, 09, 23]]) 
kernel: 2 x 2 
soln: 
array([[ 200, 119], 
     [ 120, 49]]) 

回答

12

你可以使用scikit图像block_reduce

import numpy as np 
import skimage.measure 

a = np.array([ 
     [ 20, 200, -5, 23], 
     [ -13, 134, 119, 100], 
     [ 120, 32, 49, 25], 
     [-120, 12, 9, 23] 
]) 
skimage.measure.block_reduce(a, (2,2), np.max) 

给出:

array([[200, 119], 
     [120, 49]]) 
4

如果图像尺寸是由籽粒整除大小,您可以重塑阵列,并使用maxmean,因为您认为合适

import numpy as np 

mat = np.array([[ 20, 200, -5, 23], 
     [ -13, 134, 119, 100], 
     [ 120, 32, 49, 25], 
     [-120, 12, 9, 23]]) 

M, N = mat.shape 
K = 2 
L = 2 

MK = M // K 
NL = N // L 
print(mat[:MK*K, :NL*L].reshape(MK, K, NL, L).max(axis=(1, 3))) 
# [[200, 119], [120, 49]] 

如果您没有偶数个内核,则必须单独处理边界。 (正如在评论中指出的那样,这会导致矩阵被复制,这会影响性能)。

mat = np.array([[20, 200, -5, 23, 7], 
       [-13, 134, 119, 100, 8], 
       [120, 32, 49, 25, 12], 
       [-120, 12, 9, 23, 15], 
       [-57, 84, 19, 17, 82], 
       ]) 
# soln 
# [200, 119, 8] 
# [120, 49, 15] 
# [84, 19, 82] 
M, N = mat.shape 
K = 2 
L = 2 

MK = M // K 
NL = N // L 

# split the matrix into 'quadrants' 
Q1 = mat[:MK * K, :NL * L].reshape(MK, K, NL, L).max(axis=(1, 3)) 
Q2 = mat[MK * K:, :NL * L].reshape(-1, NL, L).max(axis=2) 
Q3 = mat[:MK * K, NL * L:].reshape(MK, K, -1).max(axis=1) 
Q4 = mat[MK * K:, NL * L:].max() 

# compose the individual quadrants into one new matrix 
soln = np.vstack([np.c_[Q1, Q3], np.c_[Q2, Q4]]) 
print(soln) 
# [[200 119 8] 
# [120 49 15] 
# [ 84 19 82]] 
+0

'M,N = mat.shape'会在这里更清晰。此外,您应该指出,即使内核不分割源代码,但丢弃边界(并产生副本),您的答案仍然有效。 – Eric

相关问题