¿Cómo puedo procesar eficientemente una matriz numpy en bloques similares a la función blkproc (blockproc) de Matlab
Estoy buscando un buen enfoque para dividir eficientemente una imagen en regiones pequeñas, procesar cada región por separado y luego volver a ensamblar los resultados de cada proceso en una sola imagen procesada. Matlab tenía una herramienta para esto llamada blkproc (reemplazado porblockproc
en versiones más recientes de Matlab).
En un mundo ideal, la función o clase también admitiría la superposición entre las divisiones en la matriz de entrada. En la ayuda de Matlab, blkproc se define como:
B = blkproc (A, [m n], [mborder nborder], diversión, ...)
A es su matriz de entrada, [m n] es el tamaño del bloque [mborder, nborder] es el tamaño de su región fronteriza (opcional)fun es una función para aplicar a cada bloqueHe armado un enfoque, pero me parece torpe y apuesto a que hay una manera mucho mejor. A riesgo de mi propia vergüenza, aquí está mi código:
import numpy as np
def segmented_process(M, blk_size=(16,16), overlap=(0,0), fun=None):
rows = []
for i in range(0, M.shape[0], blk_size[0]):
cols = []
for j in range(0, M.shape[1], blk_size[1]):
cols.append(fun(M[i:i+blk_size[0], j:j+blk_size[1]]))
rows.append(np.concatenate(cols, axis=1))
return np.concatenate(rows, axis=0)
R = np.random.rand(128,128)
passthrough = lambda(x):x
Rprime = segmented_process(R, blk_size=(16,16),
overlap=(0,0),
fun=passthrough)
np.all(R==Rprime)