Una breve discusión sobre la función de convolución de Python

Este artículo presenta principalmente la comprensión de Python sobre la convolución. Hay ejemplos de código detallados en el artículo, que tienen un buen valor de referencia. Espero que sea útil para todos.

función de convolución

pythonProporciona una variedad de esquemas de convolución. En comparación, la función de convolución definida en es ligeramente más compleja ndimageque la convolución en numpyy . Esto se puede vislumbrar solo por el número de parámetros de entrada.signal

1

2

3

4

5

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)

Las dos primeras son funciones de convolución unidimensionales, y ndimage puede realizar operaciones de convolución en matrices multidimensionales a lo largo de un único eje de coordenadas, y las dos últimas son convoluciones multidimensionales.

Las funciones de convolución en numpy y signal tienen tres modos, que se utilizan para ajustar las características del borde después de la convolución. Si las dimensiones de los dos objetos de convolución de entrada son N NN y M MM respectivamente, entonces la salida de estos tres modos El resultado es

  • full: La dimensión de salida es N + M − 1 N + M-1N + M − 1. Las señales en el último punto no se superponen en absoluto, por lo que el efecto de borde es obvio.
  • same: Dimensión de salida máx ⁡ ( M , N ) \max(M,N)max(M,N), los efectos de borde aún son visibles
  • valid: Dimensión de salida ∣ M − N ∣ |MN|∣M−N∣, solo devuelve áreas completamente superpuestas, lo que equivale a eliminar todos los puntos con efectos de borde.

 ndimageEn convolvevista del efecto de borde, la imagen se expande y lo que modedetermina es el formato de relleno después de la expansión. Supongamos que la matriz a filtrar es a b c d, luego, en diferentes modos, los bordes se rellenan de la siguiente manera

relleno izquierdo datos acolchado derecho
reflect dcba a B C D dcba
constant kkkk a B C D kkkk
nearest aaaa a B C D dddd
mirror DCB a B C D cba
wrap a B C D a B C D a B C D

Entre ellos, se establece kmediante parámetros cval.

Estos cinco métodos para modificar límites scipy.ndimageson muy comunes en funciones, especialmente en funciones de filtro que involucran convolución, que son estándar.

prueba de comparación

A continuación, haga una prueba de rendimiento para estas diferentes funciones de convolución. Utilice una plantilla de convolución de 5 × 5 para realizar cálculos de convolución en una matriz de 1000 × 1000. Echemos un vistazo a la velocidad de convolución en diferentes implementaciones.

1

2

3

4

5

6

7

8

9

10

11

12

13

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

En comparación, ndimagela convolución es obviamente más eficiente.

接下来测试一下一维卷积的表现

1

2

3

4

5

6

7

8

9

10

11

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中提供的函数速度最慢。

转自:微点阅读   https://www.weidianyuedu.com

Supongo que te gusta

Origin blog.csdn.net/weixin_45707610/article/details/131787999
Recomendado
Clasificación