大規模な画像/配列のブロック単位で呼び出したいメモリ集中型イメージフィルタがあります(配列全体のフィルタを計算するため、配列全体を計算しようとすると、ブロック単位の処理関数内からフィルタ関数を呼び出す
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)
、で計算されます。一部のフィルタは他のパラメータより多くのパラメータを持ちます。フィルターされた配列を返します。
二つの質問
- にはどうすればblock_process関数を介して私のフィルタ機能のいずれかを呼び出すことについては行くのですか?ブロック処理コードを各関数にコピーする必要はありません。つまり、
block_process()
コールのパラメータとして呼び出すフィルタ(およびどのパラメータ)を指定する方法がありますか? - これをより良い方法でコーディングできますか?
ありがとう、これは素晴らしいです。私のフィルターは大きな(5000x5000)アレイ上で実行されており、メモリに同じサイズのアレイを3〜4つ追加する必要があるため、メモリが不足しているのですが、それは別の質問です。 – Benjamin
@Benjamin:付加的な配列の数を減らすことができます。これは実際に別の質問のためになる可能性があります。 –
@Benjamin - チャンク内での作業のもう一つの利点は、マルチプロセッシングを使って複数のプロセッサに計算を広げることが容易になることです。 。したがって、後でメモリの問題が修正されたとしても、このようなものをチャンクすると便利です。 –