zoukankan      html  css  js  c++  java
  • python conv2d 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])
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    卷积运算大致可以分成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() #显示图像
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

    *二维图像卷积运算

    >>> 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() #显示绘制好的画布
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    二维的卷积需要用上面的signal.convolve2d()。 
    之所以要对卷积后的图像数组grad作np.absolute()求绝对值运算是因为灰度图像的值都是正值,没有负的,为了防止出现负值所以才这样做。 
    20170728234210198  
    二维的卷积运算还有一种函数,是signal.sepfir2d(),它可以传入三个参数,后两个参数指定行和列的卷积和(两个方向上的卷积是可以不同的,分别指定卷积和序列)。

  • 相关阅读:
    无重复字符的最长子串
    有效的括号
    最长公共前缀
    罗马数字转整数
    Android解析JSON数据异步加载新闻图片
    回文数
    Java从Json获得数据的四种方式
    JavaMD5加密工具类
    div模仿select效果二:带搜索框
    BG雪碧图制作要求
  • 原文地址:https://www.cnblogs.com/hdk1993/p/8784605.html
Copyright © 2011-2022 走看看