Maison  >  Article  >  développement back-end  >  Comment utiliser la fonction de convolution Python

Comment utiliser la fonction de convolution Python

WBOY
WBOYavant
2023-05-20 21:31:111744parcourir

Fonction de convolution

python fournit une variété de schémas de convolution. En comparaison, la fonction de convolution définie dans ndimage est plus fonctionnelle que La convolution dans numpy et <code>signal est légèrement plus compliqué. Cela peut être vu uniquement à partir du nombre de paramètres d'entréepython提供了多种卷积方案,相比之下,定义在ndimage中的卷积函数,在功能上比numpysignal中的卷积要稍微复杂一些,这点仅从输入参数的多少就可略窥一二

numpy.convolve(a, v, mode=&#39;full&#39;)
scipy.ndimage.convolve1d(input, weights, axis=-1, output=None, mode=&#39;reflect&#39;, cval=0.0, origin=0)

scipy.signal.convolve(in1, in2, mode=&#39;full&#39;, method=&#39;auto&#39;)
scipy.ndimage.convolve(input, weights, output=None, mode=&#39;reflect&#39;, 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

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()

Les deux premiers sont des fonctions de convolution unidimensionnelles et ndimage peut effectuer des opérations de convolution sur des tableaux multidimensionnels. le long d’un seul axe de coordonnées, et les deux dernières sont des convolutions multidimensionnelles.

Les fonctions de convolution dans numpy et signal ont trois modes, qui sont utilisés pour ajuster les caractéristiques de bord après convolution. Si les dimensions des deux objets de convolution d'entrée sont respectivement N NN et M MM, alors ces trois modes Le résultat de sortie est

.

  • full : dimension de sortie N + M &moins; 1 N+M-1N+M−1, et sa finale Les signaux à un les points ne se chevauchent pas du tout, donc l'effet de bord est évident.

  • Comment utiliser la fonction de convolution Pythonidem : Dimension de sortie max ⁡ ( M , N ) max(M,N)max(M,N), les effets de bord sont toujours visibles
  • valid : Dimension de sortie ∣ M − N ∣ |M-N|∣M−N∣, ne renvoie que les zones complètement superposées, ce qui équivaut à éliminer tous les points avec des effets de bord

    li>
🎜 convolve dans ndimage agrandit l'image pour les effets de bord, et son mode détermine le format de remplissage étendu, en supposant que le le tableau à filtrer est a b c d, puis dans différents modes, les bords sont remplis comme suit🎜a b c d td>

Remplissage à gauche Données Remplissage à droite
réfléchir 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
le plus proche td> a a a a a a b c d d d d d
miroir d c b a b c d c b a
enveloppera b c d a b c d
🎜Parmi eux, k passe le paramètre cval paramètres. 🎜🎜Ces cinq méthodes de modification de la limite sont très courantes dans les fonctions de <code>scipy.ndimage, notamment les fonctions de filtre impliquant la convolution, qui sont standards. 🎜🎜Test de comparaison🎜🎜 Ensuite, effectuez un test de performances pour ces différentes fonctions de convolution. Utilisez un modèle de convolution 5 × 🎜rrreee🎜En comparaison, la convolution dans ndimage est évidemment plus efficace. 🎜🎜Ensuite, testons les performances de la convolution unidimensionnelle🎜rrreee🎜En revanche, convolve1d est bien la fonction de convolution de 1d, qui est la plus rapide des fonctions fournies. dans numpy sont les plus lents. 🎜🎜Application de convolution🎜🎜Les opérations de convolution sont souvent utilisées dans le filtrage d'images et l'extraction de bords. Par exemple, grâce à une matrice similaire à celle ci-dessous, les bords verticaux de l'image peuvent être extraits. 🎜🎜🎜🎜🎜Faisons un test simple🎜rrreee

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer