Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie die Python-Faltungsfunktion

So verwenden Sie die Python-Faltungsfunktion

WBOY
WBOYnach vorne
2023-05-20 21:31:111730Durchsuche

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中的卷积函数,在功能上比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,则在不同的模式下,对边缘进行如下填充


左侧填充 数据 右侧填充
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

Die Faltungsfunktionen in Numpy und Signal verfügen über drei Modi, mit denen die Kanteneigenschaften nach der Faltung angepasst werden. Wenn die Abmessungen der beiden Eingabefaltungsobjekte N NN bzw. M MM sind, sind diese drei Modi Das Ausgabeergebnis ist

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

  • So verwenden Sie die Python-Faltungsfunktionvalid: 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

    a b c d td>

    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
    wrapa b c d a b c d
    Unter diesen übergibt 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🎜rrreee

    Das 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!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen