首頁  >  文章  >  後端開發  >  Python卷積函數怎麼用

Python卷積函數怎麼用

WBOY
WBOY轉載
2023-05-20 21:31:111744瀏覽

卷積函數

python提供了多種卷積方案,相較之下,定義在ndimage中的捲積函數,在功能上比numpysignal中的捲積要稍微複雜一些,這點僅從輸入參數的多少就可略窺一二

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,則在不同的模式下,對邊緣進行如下填入

##左側填充資料#右側填充d c b aa b c dd c b a#k k k k a b c dk k k kmirror##c b a

reflect
constant
#nearest##a a a a #a b c d d d d d
#d c b a b c d

Python卷積函數怎麼用

#######>###### #########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卷積函數怎麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除