我知道numpy
包含了一个卷积函数。
问题是我需要自己编写,我可以用这种形式编写简单的东西(类似的东西):
for i in range(-1, 2):
for j in range(-1, 2):
pixel[position1] += pixel[position2]*kernel[position3]
但我需要编写一个矢量化实现,有什么帮助吗?
感谢。
注意:我已经使用了numpy和scipy,但为了练习,我需要编写自己的函数。
答案 0 :(得分: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却没有。
这只是基本方法,并且有一些方法可以加快速度(例如,使用临时数组或就地计算),还必须决定在边界上做什么;虽然上面的内容经常是正确的。