我有一些内存密集型图像过滤器,我想在大型图像/数组上逐块调用(因为它们为整个数组计算过滤器,在尝试计算整个数组时它们会耗尽内存)。
def block_process(Ic, blocksize):
B = numpy.empty(Ic.shape)
colstart = 0
while colstart < Ic.shape[1]:
BlockWidth = blocksize
if (colstart + blocksize) > Ic.shape[1]:
BlockWidth = Ic.shape[1] - colstart
rowstart = 0
while rowstart < Ic.shape[0]:
BlockHeight = blocksize
if (rowstart + blocksize) > Ic.shape[0]:
BlockHeight = Ic.shape[0] - rowstart
B[colstart:colstart+BlockWidth, rowstart:rowstart+BlockHeight] = filter1(params) # One of many available filters
rowstart += BlockHeight
colstart += BlockWidth
return B # The complete filtered array
我的过滤器是在其他函数中计算的,即def filter1(A, filtsize)
,def filter2(A, filtsize, otherparam)
,它们具有A
参数(输入数组,由块函数给出),以及其他参数,如过滤器尺寸。某些过滤器的参数比其他过滤器多。它们返回过滤后的数组。
两个问题
block_process()
调用的参数?答案 0 :(得分:2)
你可以这样做:
def block_process(a, blocksize, filt, args):
b = numpy.empty(a.shape)
for row in xrange(0, a.shape[0], blocksize):
for col in xrange(0, a.shape[1], blocksize):
b[row:row + blocksize, col:col + blocksize] = (
filt(a[row:row + blocksize, col:col + blocksize], *args))
return b
无需更正图像右下边缘的不完整块 - 这将自动进行。您可以简单地传入过滤器函数和参数元组。要调用过滤器filter1(a, filtsize)
,请使用
block_process(a, blocksize, filter1, (filtsize,))
上面的代码假设过滤器的第一个参数是要过滤的数组,过滤器返回相同形状的过滤数组。
您的过滤器也可能以不使用尽可能多的内存的方式重写,因此不需要进行块处理。