Я ищу хороший подход для эффективного разделения изображения на небольшие регионы, обработки каждого региона отдельно, а затем повторной сборки результатов из каждого процесса в одно обработанное изображение. У Matlab был инструмент для этого blkproc (заменен на blockproc
в новых версиях Matlab).
В идеальном мире функция или класс будут поддерживать перекрытие между делениями во входной матрице. В справке Matlab blkproc определяется как:
B = blkproc (A, [m n], [mborder nborder], fun,...)
- A - ваша матрица ввода,
- [m n] - размер блока
- [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)