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

相關文章
相關標籤/搜索