Heim > Artikel > Backend-Entwicklung > So verwenden Sie die Python-Faltungsfunktion
python
bietet eine Vielzahl von Faltungsschemata. Im Vergleich dazu ist die in ndimage
definierte Faltungsfunktion funktionaler als Die Faltung in Numpy
und signal
ist etwas komplizierter. Dies lässt sich allein an der Anzahl der Eingabeparameter erkennen. Die ersten beiden sind eindimensionale Faltungsfunktionen. Und ndimage kann Faltungsoperationen für mehrdimensionale Arrays durchführen entlang einer einzelnen Koordinatenachse, und die beiden letzteren sind mehrdimensionale Faltungen. 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
full
: Ausgabedimension N + M − 1 N+M-1N+M−1 und ihre endgültigen Signale bei eins Die Punkte überlappen sich überhaupt nicht, daher ist der Kanteneffekt offensichtlich.
gleich
: Ausgabedimension max ( M , N ) max(M,N)max(M,N), Kanteneffekte sind weiterhin sichtbar
valid
: Ausgabedimension ∣ M − li> convolve
in ndimage
erweitert das Bild für Kanteneffekte und sein mode
bestimmt das erweiterte Füllformat, vorausgesetzt, dass das Das zu filternde Array ist a b c d
, dann werden die Kanten in verschiedenen Modi wie folgt gefüllt
|
Auffüllung links | Daten | Auffüllung rechts |
---|---|---|---|
reflect |
d c b a | a b c d | d c b a |
constant Code> | k k k k | a b c d | k k k k |
nearest td><td>a a a a a</td>
<td>a b c d</td>
<td>d d d d</td> | |||
mirror |
d c b | a b c d | c b a |
wrap | a b c d td>a b c d | a b c d |
k
den Parameter cval Einstellungen. 🎜🎜Diese fünf Methoden zum Ändern der Grenze sind in den Funktionen von <code>scipy.ndimage
sehr verbreitet, insbesondere in den Standardfilterfunktionen mit Faltung. 🎜🎜Vergleichstest🎜🎜 Führen Sie als Nächstes einen Leistungstest für diese verschiedenen Faltungsfunktionen durch, um Faltungsberechnungen für eine 1000 × 1000-Matrix durchzuführen 🎜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()🎜Im Vergleich dazu ist die Faltung in
ndimage
offensichtlich effizienter. 🎜🎜Als nächstes testen wir die Leistung der eindimensionalen Faltung🎜rrreee🎜Im Gegensatz dazu ist convolve1d
tatsächlich die Faltungsfunktion von 1d
, die die schnellste ist Die bereitgestellten Funktionen in numpy
sind die langsamsten. 🎜🎜Faltungsanwendung🎜🎜Faltungsoperationen werden häufig bei der Bildfilterung und Kantenextraktion verwendet. Mithilfe einer Matrix ähnlich der folgenden können beispielsweise die vertikalen Kanten des Bildes extrahiert werden. 🎜🎜🎜🎜🎜Lass uns einen einfachen Test machen🎜rrreeeDas obige ist der detaillierte Inhalt vonSo verwenden Sie die Python-Faltungsfunktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!