2014-03-13 83 views
2

我知道numpy包含一個卷積函數。圖像卷積函數的矢量化實現

的事情是我需要寫我自己,我可以簡單的寫它以這種形式(類似的東西):

for i in range(-1, 2): 
    for j in range(-1, 2): 
     pixel[position1] += pixel[position2]*kernel[position3] 

但我需要寫一個量化的實施,任何幫助嗎?

謝謝。

注意:我已經在使用numpy和scipy了,但爲了練習,我需要編寫自己的函數。

+0

https://github.com/scipy/scipy/blob/master/scipy/signal/firfilter.c#L104 – YXD

回答

2

編寫你自己的卷積可以提供更快的計算,特別是當你有一個有很多1和0的小內核的時候。例如,

kernel = array([[0, 1, 0], 
       [1,-4, 1], 
       [0, 1, 0]]) 

卷積可以寫成

laplace = -4*u[1:-1,1:-1] + u[2:,1:-1] + u[:-2,1:-1] + u[1:-1,2:] + u[1:-1,:-2] 

這裏的優勢在於,只有一個乘法和四次加法,而拼盡了全力通常的卷積將達到九個乘法和加法。另外,儘管scipy有2d卷積,但是單獨的numpy沒有。

這只是基本的方法,並且有方法可以加快速度(例如,使用臨時數組或臨時計算),並且還必須決定在邊界上執行什麼操作;儘管上述情況通常是正確的。