从逐块处理函数中调用过滤器函数

时间:2011-02-10 14:59:31

标签: python image-processing workflow numpy

我有一些内存密集型图像过滤器,我想在大型图像/数组上逐块调用(因为它们为整个数组计算过滤器,在尝试计算整个数组时它们会耗尽内存)。

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参数(输入数组,由块函数给出),以及其他参数,如过滤器尺寸。某些过滤器的参数比其他过滤器多。它们返回过滤后的数组。

两个问题

  1. 如何通过block_process函数调用我的一个过滤器函数?我不想将块处理代码复制到每个函数中。换句话说,有没有办法指定要调用哪个过滤器(以及使用什么参数)作为block_process()调用的参数?
  2. 有更好的编码方式吗?

1 个答案:

答案 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,))

上面的代码假设过滤器的第一个参数是要过滤的数组,过滤器返回相同形状的过滤数组。

您的过滤器也可能以不使用尽可能多的内存的方式重写,因此不需要进行块处理。