2011-02-10 58 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 

我的過濾器計算的其他功能即def filter1(A, filtsize)def filter2(A, filtsize, otherparam),其具有A參數(輸入數組,由塊函數給出),以及其他參數,例如濾波器的尺寸。一些過濾器比其他過濾器有更多參數他們返回已過濾的數組。

兩個問題

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

上面的代碼假定對一個過濾器的第一個參數是要過濾的陣列和一個過濾器返回相同形狀的濾波陣列。

它也可能是您的過濾器可以在某種程度上,他們不使用盡可能多的內存被改寫,所以blockprocessing將變得不必要。

+0

謝謝,這太棒了。我的過濾器在大(5000x5000)陣列運行,並且需要保持在內存中的大小相同,這就是爲什麼他們耗盡內存的額外3-4陣列,但這是另外一個問題... – Benjamin 2011-02-10 15:25:17