python scipy卷积运算的实现方法

 更新时间:2019年09月16日 15:21:56   作者:刘知昊  
这篇文章主要介绍了python scipy卷积运算的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

scipy的signal模块经常用于信号处理,卷积、傅里叶变换、各种滤波、差值算法等。

*两个一维信号卷积

>>> import numpy as np
>>> x=np.array([1,2,3])
>>> h=np.array([4,5,6])
>>> import scipy.signal
>>> scipy.signal.convolve(x,h) #卷积运算
array([ 4, 13, 28, 27, 18])

卷积运算大致可以分成3步,首先先翻转,让两个信号列反过来,如上面就是1,2,3和6,5,4。然后作平移,6,5,4最开始在1,2,3的左边,没有重叠,现在向右移动,4和1就重叠了。对于重叠的部分,作乘积求和。也就是1x4得到第一个结果1,然后再移动后5x1+4x2得到第二个结果13以此类推。

卷积运算可以用来做大整数的乘法(数组表示数的乘法),比如在上面的例子中,要求123乘以456,可以先得到它的卷积序列,然后从后往前,18将8保留,进位1给27;然后27变成28,把8保留进位2给28;然后28变成30,把0保留进位3给13;然后13变成16,把6保留进位1给4;4变成5即是最高位。也就是乘法的结果是56088。

*对白噪声卷积

>>> import numpy as np
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> sig=np.random.randn(1000) #生成随机数
>>> autocorr=signal.fftconvolve(sig,sig[::-1],mode='full') #fft算法实现卷积
>>> fig,(ax_orig,ax_mag)=plt.subplots(2,1) #建立两行一列图形
>>> ax_orig.plot(sig) #在第一行把原始的随机数序列sig画出来
[<matplotlib.lines.Line2D object at 0x0000000006E1DC88>]
>>> ax_orig.set_title('White noise') #设置标题'白噪声'
<matplotlib.text.Text object at 0x0000000006931860>
>>> ax_mag.plot(np.arange(-len(sig)+1,len(sig)),autocorr) #卷积后的图像
[<matplotlib.lines.Line2D object at 0x0000000006E1DB00>]
>>> ax_mag.set_title('Autocorrelation') #设置标题
<matplotlib.text.Text object at 0x0000000006DFE8D0>
>>> fig.tight_layout() #此句可以防止图像重叠
>>> fig.show() #显示图像

fftconvolve只是用fft算法(快速傅立叶变换)实现的卷积,其结果应当和普通的convolve一样。

这里写图片描述

*二维图像卷积运算

>>> import numpy as np
>>> from scipy import signal
>>> from scipy import misc
>>> import matplotlib.pyplot as plt
>>> face=misc.face(gray=True) #创建一个灰度图像
>>> scharr=np.array([[-3-3j,0-10j,+3-3j],
    [-10+0j,0+0j,+10+0j],
     [-3+3j,0+10j,+3+3j]]) #设置一个特殊的卷积和
>>> grad=signal.convolve2d(face,scharr,boundary='symm',mode='same') #把图像的face数组和设计好的卷积和作二维卷积运算,设计边界处理方式为symm
>>> fig,(ax1,ax2)=plt.subplots(1,2,figsize=(10,6)) #建立1行2列的图fig
>>> ax1.imshow(face,cmap='gray') #显示原始的图
<matplotlib.image.AxesImage object at 0x00000000078FC198>
>>> ax1.set_axis_off() #不显示坐标轴
>>> ax2.imshow(np.absolute(grad),cmap='gray') #显示卷积后的图
<matplotlib.image.AxesImage object at 0x00000000078FCE48>
>>> ax2.set_axis_off() #不显示坐标轴
>>> fig.show() #显示绘制好的画布

二维的卷积需要用上面的signal.convolve2d()。

之所以要对卷积后的图像数组grad作np.absolute()求绝对值运算是因为灰度图像的值都是正值,没有负的,为了防止出现负值所以才这样做。

这里写图片描述 

二维的卷积运算还有一种函数,是signal.sepfir2d(),它可以传入三个参数,后两个参数指定行和列的卷积和(两个方向上的卷积是可以不同的,分别指定卷积和序列)。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • python虚拟环境创建的两种方法

    python虚拟环境创建的两种方法

    本文主要介绍了python虚拟环境创建的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Python3中延时变量和 free_list链表的区别解析

    Python3中延时变量和 free_list链表的区别解析

    这篇文章主要介绍了Python3中延时变量和 free_list链表的区别,在Python3中,"延时变量" 和 "free_list链表" 是两个不同的概念,他们之间没有直接联系,本文给实例相结合给大家讲解的非常详细,需要的朋友可以参考下
    2023-04-04
  • PyQt实现计数器的方法示例

    PyQt实现计数器的方法示例

    这篇文章主要介绍了PyQt实现计数器的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • pytorch对梯度进行可视化进行梯度检查教程

    pytorch对梯度进行可视化进行梯度检查教程

    今天小编就为大家分享一篇pytorch对梯度进行可视化进行梯度检查教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python matplotlib绘制xkcd动漫风格的图表

    Python matplotlib绘制xkcd动漫风格的图表

    xkcd是兰道尔·门罗(Randall Munroe)的网名,又是他所创作的漫画的名称。本文将用matplotlib库绘制xkcd动漫风格的图表,感兴趣的可以了解一下
    2022-03-03
  • Python 单元测试(unittest)的使用小结

    Python 单元测试(unittest)的使用小结

    Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,本篇文章主要介绍了Python 单元测试(unittest)的使用小结,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Python边缘检测之prewitt,sobel和laplace算子详解

    Python边缘检测之prewitt,sobel和laplace算子详解

    这篇文章主要为大家详细介绍了Python边缘检测中prewitt、sobel和laplace算子的使用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-04-04
  • Python入门之三角函数sin()函数实例详解

    Python入门之三角函数sin()函数实例详解

    这篇文章主要介绍了Python入门之三角函数sin()函数实例详解,分享了相关实例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • python中tkinter窗口位置\坐标\大小等实现示例

    python中tkinter窗口位置\坐标\大小等实现示例

    这篇文章主要介绍了python中tkinter窗口位置\坐标\大小等实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Python find()、rfind()方法及作用

    Python find()、rfind()方法及作用

    这篇文章主要介绍了Python find()、rfind()方法,find方法的作用检索是否指定的字符串,如果存在返回首次出现该字符串的索引,如果不存在返回-1,rfind 方法的作用和find方法作用相同,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-12-12

最新评论