¿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 bloque

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

Respuestas a la pregunta(6)

Su respuesta a la pregunta