基于Numpy.convolve使用Python實(shí)現(xiàn)滑動(dòng)平均濾波的思路詳解
1.滑動(dòng)平均概念
滑動(dòng)平均濾波法(又稱遞推平均濾波法),時(shí)把連續(xù)取N個(gè)采樣值看成一個(gè)隊(duì)列 ,隊(duì)列的長(zhǎng)度固定為N ,每次采樣到一個(gè)新數(shù)據(jù)放入隊(duì)尾,并扔掉原來隊(duì)首的一次數(shù)據(jù).(先進(jìn)先出原則) 把隊(duì)列中的N個(gè)數(shù)據(jù)進(jìn)行算術(shù)平均運(yùn)算,就可獲得新的濾波結(jié)果。N值的選取:流量,N=12;壓力:N=4;液面,N=4~12;溫度,N=1~4
優(yōu)點(diǎn): 對(duì)周期性干擾有良好的抑制作用,平滑度高 適用于高頻振蕩的系統(tǒng)
缺點(diǎn): 靈敏度低 對(duì)偶然出現(xiàn)的脈沖性干擾的抑制作用較差 不易消除由于脈沖干擾所引起的采樣值偏差 不適用于脈沖干擾比較嚴(yán)重的場(chǎng)合 比較浪費(fèi)RAM
2.解決思路
可以發(fā)現(xiàn)滑動(dòng)平均濾波法計(jì)算很類似與一維卷積的工作原理,滑動(dòng)平均的N就對(duì)應(yīng)一維卷積核大?。ㄩL(zhǎng)度)。
步長(zhǎng)會(huì)有些區(qū)別,滑動(dòng)平均濾波法滑動(dòng)步長(zhǎng)為1,而一維卷積步長(zhǎng)可以自定義。還有區(qū)別就是一維卷積的核參數(shù)是需要更新迭代的,而滑動(dòng)平均濾波法核參數(shù)都是一。
我們應(yīng)該怎么利用這個(gè)相似性呢?其實(shí)也很簡(jiǎn)單,只需要把一維卷積核大小(長(zhǎng)度)和N相等,步長(zhǎng)設(shè)置為1,核參數(shù)都初始為1就可以了。由于一維卷積具備速度快,然后我們就可以使用一維卷積來實(shí)現(xiàn)這個(gè)功能了,快速高效。
使用深度學(xué)習(xí)框架實(shí)現(xiàn)這個(gè)功能是否有些大材小用了?是有些大材小用了,因?yàn)檫@里使用卷積的核參數(shù)不用更新,其實(shí)沒必要使用復(fù)雜的深度學(xué)習(xí)框架,如果Numpy中可以實(shí)現(xiàn)這些功能就更簡(jiǎn)單方便了。
說干就干,經(jīng)過查找發(fā)現(xiàn)Numpy.convolve可以實(shí)現(xiàn)我們想要的功能。
3.Numpy.convolve介紹
numpy.convolve(a, v, mode=‘full')
參數(shù):
a:(N,)輸入的一維數(shù)組
v:(M,)輸入的第二個(gè)一維數(shù)組
mode:{‘full', ‘valid', ‘same'}參數(shù)可選
‘full' 默認(rèn)值,返回每一個(gè)卷積值,長(zhǎng)度是N+M-1,在卷積的邊緣處,信號(hào)不重疊,存在邊際效應(yīng)。
‘same' 返回的數(shù)組長(zhǎng)度為max(M, N),邊際效應(yīng)依舊存在。
‘valid' 返回的數(shù)組長(zhǎng)度為max(M,N)-min(M,N)+1,此時(shí)返回的是完全重疊的點(diǎn)。邊緣的點(diǎn)無效。
和一維卷積參數(shù)類似,a就是被卷積數(shù)據(jù),v是卷積核大小。
4.算法實(shí)現(xiàn)
def np_move_avg(a,n,mode="same"): return(np.convolve(a, np.ones((n,))/n, mode=mode))
原理說明
運(yùn)行平均值是卷積數(shù)學(xué)運(yùn)算的一個(gè)例子。對(duì)于運(yùn)行平均值,沿著輸入滑動(dòng)窗口并計(jì)算窗口內(nèi)容的平均值。對(duì)于離散的1D信號(hào),卷積是相同的,除了代替計(jì)算任意線性組合的平均值,即將每個(gè)元素乘以相應(yīng)的系數(shù)并將結(jié)果相加。那些系數(shù),一個(gè)用于窗口中的每個(gè)位置,有時(shí)稱為卷積核?,F(xiàn)在,N值的算術(shù)平均值是(x_1 + x_2 + ... + x_N) / N,所以相應(yīng)的內(nèi)核是(1/N, 1/N, ..., 1/N),這正是我們通過使用得到的np.ones((N,))/N。
邊緣處理
該mode的參數(shù)np.convolve指定如何處理邊緣。在這里選擇了same模式,這樣可以保證輸出長(zhǎng)度一種,但你可能還有其他優(yōu)先事項(xiàng)。這是一個(gè)說明模式之間差異的圖:
import numpy as np import matplotlib.pyplot as plt def np_move_avg(a,n,mode="same"): return(np.convolve(a, np.ones((n,))/n, mode=mode)) modes = ['full', 'same', 'valid'] for m in modes: plt.plot(np_move_avg(np.ones((200,)), 50, mode=m)); plt.axis([-10, 251, -.1, 1.1]); plt.legend(modes, loc='lower center'); plt.show()
5.參考
1. https://stackoverflow.com/questions/13728392/moving-average-or-running-mean
總結(jié)
以上所述是小編給大家介紹的Python實(shí)現(xiàn)滑動(dòng)平均濾波的思路詳解(基于Numpy.convolve),希望對(duì)大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
解決Python selenium get頁(yè)面很慢時(shí)的問題
今天小編就為大家分享一篇解決Python selenium get頁(yè)面很慢時(shí)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01python tkinter實(shí)現(xiàn)界面切換的示例代碼
今天小編就為大家分享一篇python tkinter實(shí)現(xiàn)界面切換的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06Django REST Swagger實(shí)現(xiàn)指定api參數(shù)
這篇文章主要介紹了Django REST Swagger實(shí)現(xiàn)指定api參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07用python代碼將tiff圖片存儲(chǔ)到j(luò)pg的方法
今天小編就為大家分享一篇用python代碼將tiff圖片存儲(chǔ)到j(luò)pg的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12動(dòng)態(tài)創(chuàng)建類實(shí)例代碼
Python中要?jiǎng)?chuàng)建一個(gè)類的實(shí)例,要首先導(dǎo)入該類或者該類所屬的模塊。2009-10-10Python使用for實(shí)現(xiàn)無限循環(huán)的多種方式匯總
這篇文章主要介紹了Python使用for實(shí)現(xiàn)無限循環(huán)的多種方式匯總,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03