Extração eficiente de memória de patches sobrepostos da matriz

história curta:

Esta é uma pergunta de acompanhamento para:Maneira rápida de dividir a imagem em patches sobrepostos e mesclar patches na imagem

Como devo adaptar o código fornecido na resposta para funcionar não apenas em imagens de tamanho x, y, onde um pixel é descrito por um flutuador, mas descrito por uma matriz de tamanho 3,3?

Além disso, como adaptar o código para que ele retorne um gerador, permitindo que eu itere sobre todos os patches sem precisar salvá-los na memória?

longa história:

Dada uma imagem de forma (x, y), em que cada pixel é descrito por uma matriz (3,3). Isso pode ser descrito como uma matriz de forma (x, y, 3,3). Além disso, dado um tamanho de patch de destino como (11,11), quero extrair todos os patches sobrepostos da imagem (x, y).

Observe que eu não quero obter todos os patches da matriz x, y, 3,3, mas da imagem x, y em que cada pixel é uma matriz.

Quero usar esses patches para um algoritmo de classificação de patches, iterando efetivamente todos os patches, extraindo recursos e aprendendo um classificador. No entanto, dada uma imagem enorme e um tamanho de patch grande, não há como executar essa operação sem prejudicar a limitação da memória.

Soluções possíveis:

sklearn.feature_extraction.image.extract_patches_2d fornece a função de destino, mas não é aplicável, pois falha devido a limitação de memória. (mas funciona bem para a imagem fornecida com tamanho de patch pequeno)Maneira rápida de dividir a imagem em patches sobrepostos e mesclar patches na imagem. Uma ótima resposta parece mostrar o caminho, usando avanços e não criando uma cópia da imagem de entrada. No entanto, não fui capaz de adaptar a resposta para atender às minhas necessidades.

Portanto, a pergunta é: como posso adaptar esse código para ajustar os novos dados de entrada?

def patchify(img, patch_shape):
    img = np.ascontiguousarray(img)  # won't make a copy if not needed
    X, Y = img.shape
    x, y = patch_shape
    shape = ((X-x+1), (Y-y+1), x, y) # number of patches, patch_shape
    # The right strides can be thought by:
    # 1) Thinking of `img` as a chunk of memory in C order
    # 2) Asking how many items through that chunk of memory are needed when indices
    #    i,j,k,l are incremented by one
    strides = img.itemsize*np.array([Y, 1, Y, 1])
    return np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides)

questionAnswers(1)

yourAnswerToTheQuestion