图像卷积函数的向量化实现

2 投票
1 回答
698 浏览
提问于 2025-04-17 22:07

我知道 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是没有的。

这只是基本的方法,还有一些加速的技巧(比如使用临时数组或者就地计算),另外你还需要考虑边界的处理;不过通常情况下,上面的做法就是最合适的。

撰写回答