关于Python卷积函数详解

作者:微小冷 时间:2023-06-14 01:09:27 

卷积函数

python提供了多种卷积方案,相比之下,定义在ndimage中的卷积函数,在功能上比numpysignal中的卷积要稍微复杂一些,这点仅从输入参数的多少就可略窥一二

numpy.convolve(a, v, mode='full')
scipy.ndimage.convolve1d(input, weights, axis=-1, output=None, mode='reflect', cval=0.0, origin=0)

scipy.signal.convolve(in1, in2, mode='full', method='auto')
scipy.ndimage.convolve(input, weights, output=None, mode='reflect', cval=0.0, origin=0)

前两者为1维卷积函数,且ndimage可对多维数组沿着单个坐标轴进行卷积操作,后两者为多维卷积。

numpy和signal中的卷积函数,其mode都有三种,用以调节卷积后的边缘特性,如果输入的两个卷积对象的维度分别是N NN和M MM,则这三种模式的输出结果为

  • full: 输出维度N + M − 1 N+M-1N+M−1,其最后一点的信号完全不交叠,故而边缘效应明显。

  • same:输出维度max ⁡ ( M , N ) \max(M,N)max(M,N),边缘效应仍然可见

  • valid:输出维度∣ M − N ∣ |M-N|∣M−N∣,只返回完全交叠的区域,相当于把存在边缘效应的点都率除掉了

 ndimage中的convolve针对边缘效应,对图像进行扩展,而其mode决定的就是扩展之后的填充格式,设待滤波数组为a b c d,则在不同的模式下,对边缘进行如下填充


左侧填充数据右侧填充
reflectd c b aa b c dd c b a
constantk k k ka b c dk k k k
nearesta a a aa b c dd d d d
mirrord c ba b c dc b a
wrapa b c da b c da b c d

其中,k通过参数cval设定。

这五种修改边界的方法,在scipy.ndimage的函数中十分普遍,尤其是涉及到卷积的滤波函数,堪称标配。

对比测试

接下来针对这些不同的卷积函数,做一下性能测试,用5 × 5的卷积模板,对1000 × 1000的矩阵进行卷积计算,来看一下不同实现方案的卷积,其速度如何

import numpy as np
import scipy.signal as ss
import scipy.ndimage as sn
from timeit import timeit

A = np.random.rand(1000,1000)
B = np.random.rand(5,5)

timeit(lambda : ss.convolve(A, B), number=10)
# 0.418
timeit(lambda : sn.convolve(A, B), number=10)
# 0.126

相比之下,ndimage中的卷积显然是更高效的。

接下来测试一下一维卷积的表现

A = np.random.rand(10000)
B = np.random.rand(15)

timeit(lambda : np.convolve(A, B), number=1000)
# 0.15256029999727616
timeit(lambda : ss.convolve(A, B), number=1000)
# 0.1231262000001152
timeit(lambda : sn.convolve(A, B), number=1000)
# 0.09218210000108229
timeit(lambda : sn.convolve1d(A, B), number=1000)
# 0.03915820000111125

相比之下,convolve1d不愧是写明了1d的卷积函数,速度最快,而numpy中提供的函数速度最慢。

卷积应用

卷积操作经常被作用在图像滤波以及边缘提取上,例如,通过类似下面这样的矩阵,可以将图像的纵向的边缘提取出来。

关于Python卷积函数详解

下面做一个简单的测试

from scipy.misc import ascent
import matplotlib.pyplot as plt
img = ascent()
temp = np.zeros([3,3])
temp[:,0] = -1
temp[:,2] = 1

edge = sn.convolve(img, temp)

fig = plt.figure()
ax = fig.add_subplot(121)
ax.imshow(img)
ax = fig.add_subplot(122)
ax.imshow(edge)
plt.show()

效果如下,非常明显

关于Python卷积函数详解

来源:https://tinycool.blog.csdn.net/article/details/130216850

标签:Python,卷积
0
投稿

猜你喜欢

  • Python3使用requests包抓取并保存网页源码的方法

    2022-05-27 06:48:38
  • windows中python实现自动化部署

    2023-06-24 16:04:14
  • css行高:line-height属性详解

    2008-06-24 11:42:00
  • python中时间、日期、时间戳的转换的实现方法

    2022-03-20 13:37:12
  • 使用xtrabackup实现mysql备份

    2024-01-21 07:57:57
  • Mysql 5.7.17安装后登录mysql的教程

    2024-01-15 04:28:38
  • Python中如何替换字典中的值

    2022-10-04 21:21:35
  • 详解python之简单主机批量管理工具

    2023-04-24 07:45:44
  • Python的Django框架中的URL配置与松耦合

    2022-11-19 10:23:33
  • python路径的写法及目录的获取方式

    2023-10-22 09:26:57
  • Pytorch dataloader在加载最后一个batch时卡死的解决

    2022-09-15 06:50:34
  • Oracle中获取执行计划的几种方法分析

    2023-07-17 15:18:31
  • 按钮表状态还是表动作?

    2009-03-23 18:21:00
  • 带你轻松接触 MySQL中损坏的MyISAM表

    2008-12-19 17:55:00
  • 记一次Vue中$route序列号报错

    2024-05-02 17:04:03
  • python使用循环打印所有三位数水仙花数的实例

    2022-07-02 09:58:59
  • python实现随机漫步算法

    2022-07-23 19:08:05
  • oracle下巧用bulk collect实现cursor批量fetch的sql语句

    2009-03-04 10:43:00
  • Python用csv写入文件_消除空余行的方法

    2022-04-01 09:24:57
  • JS继承--原型链继承和类式继承

    2024-04-23 09:14:45
  • asp之家 网络编程 m.aspxhome.com