2017-02-26 18 views
6

Cho ma trận 2D (M x N) và Hạt nhân 2D (K x L), làm cách nào tôi trả về ma trận là kết quả của giá trị tối đa hoặc trung bình gộp bằng cách sử dụng hạt nhân cho trước trên hình ảnh?cách thực hiện gộp nhóm tối đa/trung bình trên một mảng 2d bằng cách sử dụng numpy

Tôi muốn sử dụng numpy nếu có thể.

Lưu ý: M, N, K, L có thể vừa hoặc lẻ và không cần chia hết cho nhau, ví dụ: ma trận 7x5 và hạt nhân 2x2.

ví dụ của tổng hợp tối đa:

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]]) 

Trả lời

12

Bạn có thể sử dụng scikit-image 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) 

Cung cấp:

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

Nếu kích thước hình ảnh là chia hết cho kernal kích thước, bạn có thể định hình lại mảng và sử dụng max hoặc mean như bạn thấy phù hợp

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]] 

Nếu bạn không có số hạt nhân, bạn sẽ phải xử lý các ranh giới riêng biệt. (Như đã chỉ ra trong các ý kiến, kết quả này trong ma trận được sao chép, mà sẽ ảnh hưởng đến hiệu suất).

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' sẽ rõ ràng hơn tại đây. Ngoài ra bạn nên chỉ ra rằng câu trả lời của bạn hoạt động ngay cả khi hạt nhân không phân chia nguồn, nhưng loại bỏ các ranh giới (và phát sinh một bản sao). – Eric

Các vấn đề liên quan