Изменить масштаб матрицы путем суммирования по пикселям - PullRequest
0 голосов
/ 07 февраля 2019

Есть ли быстрый способ изменить масштаб матрицы, просто добавив смежные пиксели?

Так что для матрицы 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])

EG

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

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

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Чистым простым способом было бы преобразовать матрицу в большее количество осей и суммировать по соответствующим осям.

Y = X.reshape(X.shape[0]/n, n, X.shape[1]/m, m).sum((1, 3))
0 голосов
/ 07 февраля 2019

Вы можете векторизовать свой код, используя функции skimage.utils.view_as_blocks и numpy.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))

N и M должныбыть целыми числами n и m соответственно.В противном случае вы получите следующую ошибку:

ValueError: block_shape не совместим с arr_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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...