scipy的signal模塊常常用於信號處理,卷積、傅里葉變換、各類濾波、差值算法等。
*兩個一維信號卷積python
>>> 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')
>>> fig,(ax_orig,ax_mag)=plt.subplots(
2,
1)
>>> ax_orig.plot(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同樣。
數組
*二維圖像卷積運算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')
>>> fig,(ax1,ax2)=plt.subplots(
1,
2,figsize=(
10,
6))
>>> 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(),它能夠傳入三個參數,後兩個參數指定行和列的卷積和(兩個方向上的卷積是能夠不一樣的,分別指定卷積和序列)。dom