2014-03-13 61 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没有。

这只是基本的方法,并且有方法可以加快速度(例如,使用临时数组或临时计算),并且还必须决定在边界上执行什么操作;尽管上述情况通常是正确的。