图像卷积函数的向量化实现
我知道 numpy
里有一个叫做 convolve 的函数。
但是我需要自己写一个,我可以简单地写成这样(类似于这个):
for i in range(-1, 2):
for j in range(-1, 2):
pixel[position1] += pixel[position2]*kernel[position3]
不过我需要写一个向量化的实现,有什么建议吗?
谢谢。
备注:我已经在用 numpy 和 scipy,但我想自己写一个函数来练习。
1 个回答
1
自己写卷积运算可以让计算速度更快,特别是当你使用的小卷积核里面有很多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是没有的。
这只是基本的方法,还有一些加速的技巧(比如使用临时数组或者就地计算),另外你还需要考虑边界的处理;不过通常情况下,上面的做法就是最合适的。