關(guān)于Python卷積函數(shù)詳解
卷積函數(shù)
python
提供了多種卷積方案,相比之下,定義在ndimage
中的卷積函數(shù),在功能上比numpy
和signal
中的卷積要稍微復(fù)雜一些,這點僅從輸入?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可對多維數(shù)組沿著單個坐標(biāo)軸進(jìn)行卷積操作,后兩者為多維卷積。
numpy和signal中的卷積函數(shù),其mode都有三種,用以調(diào)節(jié)卷積后的邊緣特性,如果輸入的兩個卷積對象的維度分別是N NN和M MM,則這三種模式的輸出結(jié)果為
full
: 輸出維度N + M − 1 N+M-1N+M−1,其最后一點的信號完全不交疊,故而邊緣效應(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)的點都率除掉了
ndimage
中的convolve
針對邊緣效應(yīng),對圖像進(jìn)行擴(kuò)展,而其mode
決定的就是擴(kuò)展之后的填充格式,設(shè)待濾波數(shù)組為a b c d
,則在不同的模式下,對邊緣進(jìn)行如下填充
左側(cè)填充 | 數(shù)據(jù) | 右側(cè)填充 | |
---|---|---|---|
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
通過參數(shù)cval
設(shè)定。
這五種修改邊界的方法,在scipy.ndimage
的函數(shù)中十分普遍,尤其是涉及到卷積的濾波函數(shù),堪稱標(biāo)配。
對比測試
接下來針對這些不同的卷積函數(shù),做一下性能測試,用5 × 5的卷積模板,對1000 × 1000的矩陣進(jìn)行卷積計算,來看一下不同實現(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
中的卷積顯然是更高效的。
接下來測試一下一維卷積的表現(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)常被作用在圖像濾波以及邊緣提取上,例如,通過類似下面這樣的矩陣,可以將圖像的縱向的邊緣提取出來。
下面做一個簡單的測試
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()
效果如下,非常明顯
到此這篇關(guān)于關(guān)于Python卷積函數(shù)詳解的文章就介紹到這了,更多相關(guān)Python卷積詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中hasattr()、getattr()、setattr()函數(shù)的使用
這篇文章主要介紹了python中hasattr()、getattr()、setattr()函數(shù)的使用方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08pytorch 優(yōu)化器(optim)不同參數(shù)組,不同學(xué)習(xí)率設(shè)置的操作
這篇文章主要介紹了pytorch 優(yōu)化器(optim)不同參數(shù)組,不同學(xué)習(xí)率設(shè)置的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05python 限制函數(shù)調(diào)用次數(shù)的實例講解
下面小編就為大家分享一篇python 限制函數(shù)調(diào)用次數(shù)的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Pytorch如何打印與Keras的model.summary()類似的輸出(最新推薦)
這篇文章主要介紹了Pytorch如何打印與Keras的model.summary()類似的輸出,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07YOLOv5改進(jìn)系列之增加小目標(biāo)檢測層
yolov5出來已經(jīng)很長時間了,所以有關(guān)yolov5的一些詳細(xì)介紹在這里就不一一介紹了,下面這篇文章主要給大家介紹了關(guān)于YOLOv5改進(jìn)系列之增加小目標(biāo)檢測層的相關(guān)資料,需要的朋友可以參考下2022-09-09python解析html開發(fā)庫pyquery使用方法
PyQuery是一個類似于jQuery的Python庫,也可以說是jQuery在Python上的實現(xiàn),能夠以jQuery的語法來操作解析 HTML 文檔,易用性和解析速度都很好2014-02-02如何解決requests,已經(jīng)安裝卻無法import問題
這篇文章主要介紹了如何解決requests,已經(jīng)安裝卻無法import問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06Python實戰(zhàn)項目用PyQt5制作漫畫臉GUI界面
PyQt5 是用來創(chuàng)建Python GUI應(yīng)用程序的工具包。作為一個跨平臺的工具包,PyQt可以在所有主流操作系統(tǒng)上運行,本文主要介紹了如何用PyQt5制作漫畫臉的GUI界面2021-10-10