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

时间:2014-03-13 13:44:33

标签: python image-processing numpy scipy

我知道numpy包含了一个卷积函数。

问题是我需要自己编写,我可以用这种形式编写简单的东西(类似的东西):

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

但我需要编写一个矢量化实现,有什么帮助吗?

感谢。

注意:我已经使用了numpy和scipy,但为了练习,我需要编写自己的函数。

1 个答案:

答案 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却没有。

这只是基本方法,并且有一些方法可以加快速度(例如,使用临时数组或就地计算),还必须决定在边界上做什么;虽然上面的内容经常是正确的。