>> import numpy as np >>> x=np.array([1,2,3]) >>> h..."/>
您好,登錄后才能下訂單哦!
scipy的signal模塊經(jīng)常用于信號(hào)處理,卷積、傅里葉變換、各種濾波、差值算法等。
*兩個(gè)一維信號(hào)卷積
>>> import numpy as np >>> x=np.array([1,2,3]) >>> h=np.array([4,5,6]) >>> import scipy.signal >>> scipy.signal.convolve(x,h) #卷積運(yùn)算 array([ 4, 13, 28, 27, 18])
卷積運(yùn)算大致可以分成3步,首先先翻轉(zhuǎn),讓兩個(gè)信號(hào)列反過(guò)來(lái),如上面就是1,2,3和6,5,4。然后作平移,6,5,4最開(kāi)始在1,2,3的左邊,沒(méi)有重疊,現(xiàn)在向右移動(dòng),4和1就重疊了。對(duì)于重疊的部分,作乘積求和。也就是1x4得到第一個(gè)結(jié)果1,然后再移動(dòng)后5x1+4x2得到第二個(gè)結(jié)果13以此類(lèi)推。
卷積運(yùn)算可以用來(lái)做大整數(shù)的乘法(數(shù)組表示數(shù)的乘法),比如在上面的例子中,要求123乘以456,可以先得到它的卷積序列,然后從后往前,18將8保留,進(jìn)位1給27;然后27變成28,把8保留進(jìn)位2給28;然后28變成30,把0保留進(jìn)位3給13;然后13變成16,把6保留進(jìn)位1給4;4變成5即是最高位。也就是乘法的結(jié)果是56088。
*對(duì)白噪聲卷積
>>> import numpy as np >>> from scipy import signal >>> import matplotlib.pyplot as plt >>> sig=np.random.randn(1000) #生成隨機(jī)數(shù) >>> autocorr=signal.fftconvolve(sig,sig[::-1],mode='full') #fft算法實(shí)現(xiàn)卷積 >>> fig,(ax_orig,ax_mag)=plt.subplots(2,1) #建立兩行一列圖形 >>> ax_orig.plot(sig) #在第一行把原始的隨機(jī)數(shù)序列sig畫(huà)出來(lái) [<matplotlib.lines.Line2D object at 0x0000000006E1DC88>] >>> ax_orig.set_title('White noise') #設(shè)置標(biāo)題'白噪聲' <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') #設(shè)置標(biāo)題 <matplotlib.text.Text object at 0x0000000006DFE8D0> >>> fig.tight_layout() #此句可以防止圖像重疊 >>> fig.show() #顯示圖像
fftconvolve只是用fft算法(快速傅立葉變換)實(shí)現(xiàn)的卷積,其結(jié)果應(yīng)當(dāng)和普通的convolve一樣。
*二維圖像卷積運(yùn)算
>>> import numpy as np >>> from scipy import signal >>> from scipy import misc >>> import matplotlib.pyplot as plt >>> face=misc.face(gray=True) #創(chuàng)建一個(gè)灰度圖像 >>> scharr=np.array([[-3-3j,0-10j,+3-3j], [-10+0j,0+0j,+10+0j], [-3+3j,0+10j,+3+3j]]) #設(shè)置一個(gè)特殊的卷積和 >>> grad=signal.convolve2d(face,scharr,boundary='symm',mode='same') #把圖像的face數(shù)組和設(shè)計(jì)好的卷積和作二維卷積運(yùn)算,設(shè)計(jì)邊界處理方式為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() #不顯示坐標(biāo)軸 >>> ax2.imshow(np.absolute(grad),cmap='gray') #顯示卷積后的圖 <matplotlib.image.AxesImage object at 0x00000000078FCE48> >>> ax2.set_axis_off() #不顯示坐標(biāo)軸 >>> fig.show() #顯示繪制好的畫(huà)布
二維的卷積需要用上面的signal.convolve2d()。
之所以要對(duì)卷積后的圖像數(shù)組grad作np.absolute()求絕對(duì)值運(yùn)算是因?yàn)榛叶葓D像的值都是正值,沒(méi)有負(fù)的,為了防止出現(xiàn)負(fù)值所以才這樣做。
二維的卷積運(yùn)算還有一種函數(shù),是signal.sepfir2d(),它可以傳入三個(gè)參數(shù),后兩個(gè)參數(shù)指定行和列的卷積和(兩個(gè)方向上的卷積是可以不同的,分別指定卷積和序列)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。