python conv2d scipy卷积运算

scipy的signal模块常常用于信号处理,卷积、傅里叶变换、各类滤波、差值算法等。 
*两个一维信号卷积python

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
>>> 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。web

*对白噪声卷积算法

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
>>> 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同样。
20170728232226791 数组

*二维图像卷积运算app

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
>>> 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()求绝对值运算是由于灰度图像的值都是正值,没有负的,为了防止出现负值因此才这样作。 
20170728234210198  
二维的卷积运算还有一种函数,是signal.sepfir2d(),它能够传入三个参数,后两个参数指定行和列的卷积和(两个方向上的卷积是能够不一样的,分别指定卷积和序列)。dom

相关文章
相关标签/搜索