2011-02-10 9 views
0

大規模な画像/配列のブロック単位で呼び出したいメモリ集中型イメージフィルタがあります(配列全体のフィルタを計算するため、配列全体を計算しようとすると、ブロック単位の処理関数内からフィルタ関数を呼び出す

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 

マイフィルタはAパラメータ(ブロック関数によって指定された入力配列)、およびそのようなフィルタサイズなどの他のパラメータを有する他の関数、すなわちdef filter1(A, filtsize)def filter2(A, filtsize, otherparam)、で計算されます。一部のフィルタは他のパラメータより多くのパラメータを持ちます。フィルターされた配列を返します。

二つの質問

  1. にはどうすればblock_process関数を介して私のフィルタ機能のいずれかを呼び出すことについては行くのですか?ブロック処理コードを各関数にコピーする必要はありません。つまり、block_process()コールのパラメータとして呼び出すフィルタ(およびどのパラメータ)を指定する方法がありますか?
  2. これをより良い方法でコーディングできますか?

答えて

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

を使用して、フィルタの最初のパラメータを濾過し、フィルターが同じ形状のフィルタアレイを返すされる配列であることを前提としています。

フィルタがメモリをあまり使わないように書き換えられ、ブロック処理が不要になる可能性もあります。

+0

ありがとう、これは素晴らしいです。私のフィルターは大きな(5000x5000)アレイ上で実行されており、メモリに同じサイズのアレイを3〜4つ追加する必要があるため、メモリが不足しているのですが、それは別の質問です。 – Benjamin

+0

@Benjamin:付加的な配列の数を減らすことができます。これは実際に別の質問のためになる可能性があります。 –

+0

@Benjamin - チャンク内での作業のもう一つの利点は、マルチプロセッシングを使って複数のプロセッサに計算を広げることが容易になることです。 。したがって、後でメモリの問題が修正されたとしても、このようなものをチャンクすると便利です。 –

関連する問題