您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python卷積函數怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python卷積函數怎么使用”吧!
python
提供了多種卷積方案,相比之下,定義在ndimage
中的卷積函數,在功能上比numpy
和signal
中的卷積要稍微復雜一些,這點僅從輸入參數的多少就可略窺一二
numpy.convolve(a, v, mode='full') scipy.ndimage.convolve1d(input, weights, axis=-1, output=None, mode='reflect', cval=0.0, origin=0) scipy.signal.convolve(in1, in2, mode='full', method='auto') scipy.ndimage.convolve(input, weights, output=None, mode='reflect', cval=0.0, origin=0)
前兩者為1維卷積函數,且ndimage可對多維數組沿著單個坐標軸進行卷積操作,后兩者為多維卷積。
numpy和signal中的卷積函數,其mode都有三種,用以調節卷積后的邊緣特性,如果輸入的兩個卷積對象的維度分別是N NN和M MM,則這三種模式的輸出結果為
full
: 輸出維度N + M − 1 N+M-1N+M−1,其最后一點的信號完全不交疊,故而邊緣效應明顯。
same
:輸出維度max ? ( M , N ) \max(M,N)max(M,N),邊緣效應仍然可見
valid
:輸出維度∣ M − N ∣ |M-N|∣M−N∣,只返回完全交疊的區域,相當于把存在邊緣效應的點都率除掉了
ndimage
中的convolve
針對邊緣效應,對圖像進行擴展,而其mode
決定的就是擴展之后的填充格式,設待濾波數組為a b c d
,則在不同的模式下,對邊緣進行如下填充
左側填充 | 數據 | 右側填充 | |
---|---|---|---|
reflect | d c b a | a b c d | d c b a |
constant | k k k k | a b c d | k k k k |
nearest | a a a a | a b c d | d d d d |
mirror | d c b | a b c d | c b a |
wrap | a b c d | a b c d | a b c d |
其中,k
通過參數cval
設定。
這五種修改邊界的方法,在scipy.ndimage
的函數中十分普遍,尤其是涉及到卷積的濾波函數,堪稱標配。
接下來針對這些不同的卷積函數,做一下性能測試,用5 × 5的卷積模板,對1000 × 1000的矩陣進行卷積計算,來看一下不同實現方案的卷積,其速度如何
import numpy as np import scipy.signal as ss import scipy.ndimage as sn from timeit import timeit A = np.random.rand(1000,1000) B = np.random.rand(5,5) timeit(lambda : ss.convolve(A, B), number=10) # 0.418 timeit(lambda : sn.convolve(A, B), number=10) # 0.126
相比之下,ndimage
中的卷積顯然是更高效的。
接下來測試一下一維卷積的表現
A = np.random.rand(10000) B = np.random.rand(15) timeit(lambda : np.convolve(A, B), number=1000) # 0.15256029999727616 timeit(lambda : ss.convolve(A, B), number=1000) # 0.1231262000001152 timeit(lambda : sn.convolve(A, B), number=1000) # 0.09218210000108229 timeit(lambda : sn.convolve1d(A, B), number=1000) # 0.03915820000111125
相比之下,convolve1d
不愧是寫明了1d
的卷積函數,速度最快,而numpy
中提供的函數速度最慢。
卷積操作經常被作用在圖像濾波以及邊緣提取上,例如,通過類似下面這樣的矩陣,可以將圖像的縱向的邊緣提取出來。
下面做一個簡單的測試
from scipy.misc import ascent import matplotlib.pyplot as plt img = ascent() temp = np.zeros([3,3]) temp[:,0] = -1 temp[:,2] = 1 edge = sn.convolve(img, temp) fig = plt.figure() ax = fig.add_subplot(121) ax.imshow(img) ax = fig.add_subplot(122) ax.imshow(edge) plt.show()
感謝各位的閱讀,以上就是“Python卷積函數怎么使用”的內容了,經過本文的學習后,相信大家對Python卷積函數怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。