溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python卷積函數(shù)怎么使用

發(fā)布時(shí)間:2023-05-06 14:34:26 來源:億速云 閱讀:146 作者:zzz 欄目:開發(fā)技術(shù)

這篇文章主要講解了“Python卷積函數(shù)怎么使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python卷積函數(shù)怎么使用”吧!

卷積函數(shù)

python提供了多種卷積方案,相比之下,定義在ndimage中的卷積函數(shù),在功能上比numpysignal中的卷積要稍微復(fù)雜一些,這點(diǎn)僅從輸入?yún)?shù)的多少就可略窺一二

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維卷積函數(shù),且ndimage可對(duì)多維數(shù)組沿著單個(gè)坐標(biāo)軸進(jìn)行卷積操作,后兩者為多維卷積。

numpy和signal中的卷積函數(shù),其mode都有三種,用以調(diào)節(jié)卷積后的邊緣特性,如果輸入的兩個(gè)卷積對(duì)象的維度分別是N NN和M MM,則這三種模式的輸出結(jié)果為

  • full: 輸出維度N + M − 1 N+M-1N+M−1,其最后一點(diǎn)的信號(hào)完全不交疊,故而邊緣效應(yīng)明顯。

  • same:輸出維度max ? ( M , N ) \max(M,N)max(M,N),邊緣效應(yīng)仍然可見

  • valid:輸出維度∣ M − N ∣ |M-N|∣M−N∣,只返回完全交疊的區(qū)域,相當(dāng)于把存在邊緣效應(yīng)的點(diǎn)都率除掉了

 ndimage中的convolve針對(duì)邊緣效應(yīng),對(duì)圖像進(jìn)行擴(kuò)展,而其mode決定的就是擴(kuò)展之后的填充格式,設(shè)待濾波數(shù)組為a b c d,則在不同的模式下,對(duì)邊緣進(jìn)行如下填充


左側(cè)填充數(shù)據(jù)右側(cè)填充
reflectd c b aa b c dd c b a
constantk k k ka b c dk k k k
nearesta a a aa b c dd d d d
mirrord c ba b c dc b a
wrapa b c da b c da b c d

其中,k通過參數(shù)cval設(shè)定。

這五種修改邊界的方法,在scipy.ndimage的函數(shù)中十分普遍,尤其是涉及到卷積的濾波函數(shù),堪稱標(biāo)配。

對(duì)比測(cè)試

接下來針對(duì)這些不同的卷積函數(shù),做一下性能測(cè)試,用5 × 5的卷積模板,對(duì)1000 × 1000的矩陣進(jìn)行卷積計(jì)算,來看一下不同實(shí)現(xiàn)方案的卷積,其速度如何

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中的卷積顯然是更高效的。

接下來測(cè)試一下一維卷積的表現(xiàn)

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的卷積函數(shù),速度最快,而numpy中提供的函數(shù)速度最慢。

卷積應(yīng)用

卷積操作經(jīng)常被作用在圖像濾波以及邊緣提取上,例如,通過類似下面這樣的矩陣,可以將圖像的縱向的邊緣提取出來。

Python卷積函數(shù)怎么使用

下面做一個(gè)簡(jiǎn)單的測(cè)試

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卷積函數(shù)怎么使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Python卷積函數(shù)怎么使用這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(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)容。

AI