Home  >  Article  >  Backend Development  >  How to use Python convolution function

How to use Python convolution function

WBOY
WBOYforward
2023-05-20 21:31:111743browse

Convolution function

python provides a variety of convolution schemes. In contrast, the convolution function defined in ndimage is functionally It is slightly more complicated than the convolution in numpy and signal. This can be seen just from the number of input parameters.

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)

The first two are 1-dimensional convolution function, and ndimage can perform convolution operations on multi-dimensional arrays along a single coordinate axis, and the latter two are multi-dimensional convolutions.

The convolution functions in numpy and signal have three modes, which are used to adjust the edge characteristics after convolution. If the dimensions of the two input convolution objects are N NN and M MM, then The output results of these three modes are

  • full: The output dimension is N M − 1 N M-1N M−1, and the signals at the last point are completely disjoint. overlap, so the edge effect is obvious.

  • same: Output dimension max ⁡ ( M , N ) \max(M,N)max(M,N), edge effects are still visible

  • ##valid: Output dimension∣M − The convolve

    in the

ndimage are all eliminated for the edge effect, and the image is expanded, and its modeThe decision is the filling format after expansion. Assume that the array to be filtered is a b c d, then in different modes, fill the edges as follows

Left paddingDataRight paddingd c b aa b c dd c b a##constant##nearesta b c dd d d##mirrorwrapwhere , k is set by parameter

reflect
k k k k a b c d k k k k
a a a a
d c ba b c d c b a
a b c da b c d a b c d
cval

. These five methods of modifying the boundary are very common among the functions of scipy.ndimage, especially the filter functions involving convolution, which are standard.

Comparative testNext, do a performance test for these different convolution functions. Use a 5 × 5 convolution template to perform convolution calculations on a 1000 × 1000 matrix. , let’s take a look at the convolution of different implementations and how fast it is

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

In comparison, the convolution in

ndimage

is obviously more efficient.

Next, test the performance of one-dimensional convolution <pre class="brush:py;">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</pre> In contrast,

convolve1d

is indeed the convolution of

1d

function, the fastest, while the functions provided in numpy are the slowest. Convolution applicationConvolution operations are often used in image filtering and edge extraction. For example, through a matrix similar to the one below, the vertical edges of the image can be extracted.

Let’s do a simple test

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

The above is the detailed content of How to use Python convolution function. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:yisu.com. If there is any infringement, please contact admin@php.cn delete