Как я могу эффективно обрабатывать массив numpy в блоках, подобных функции Matlab blkproc (blockproc)

Я ищу хороший подход для эффективного разделения изображения на небольшие области, обработки каждой области отдельно, а затем повторной сборки результатов из каждый процесс в единое обработанное изображение. В Matlab был инструмент для этого под названием blkproc (замененный на blockproc в новых версиях Matlab).

В идеальном мире функция или класс также должны поддерживать перекрытие между подразделениями во входной матрице. В справке Matlab blkproc определяется как:

B = blkproc (A, [mn], [mborder nborder], fun, ...)

  • A - ваша входная матрица,
  • обработка каждой области отдельно, а затем повторная сборка результатов каждого процесса в одно обработанное изображение. В Matlab был инструмент для этого под названием blkproc (замененный на blockproc в новых версиях Matlab).

    В идеальном мире функция или класс также должны поддерживать перекрытие между подразделениями во входной матрице. В справке Matlab blkproc определяется как:

    B = blkproc (A, [mn], [mborder nborder], fun, ...)

    • A - ваша входная матрица,
    • обработка каждой области отдельно, а затем повторная сборка результатов каждого процесса в одно обработанное изображение. В Matlab был инструмент для этого под названием blkproc (замененный на blockproc в новых версиях Matlab).

      В идеальном мире функция или класс также должны поддерживать перекрытие между подразделениями входной матрицы. В справке Matlab blkproc определяется как:

      B = blkproc (A, [mn], [mborder nborder], fun, ...)

      • A - ваша входная матрица,
      • [mn] - размер блока
      • [mborder, nborder] - размер вашей пограничной области (необязательно).
      • fun - это функция, применяемая к каждому блоку

      Я собрал подход, но он кажется мне неуклюжим, и я уверен, что гораздо лучший способ. Рискуя смущаться, вот мой код:


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)

25
задан horchler 5 November 2013 в 15:02
поделиться