文章目录
基本原理
卷积是一种积分变换方法,可理解为滑动平均的推广,在连续函数和数列上的定义分别为
f ( t ) ∗ g ( t ) = ∫ f ( τ ) g ( t − τ ) d τ x ( n ) ∗ h ( n ) = ∑ x ( i ) h ( n − i ) f(t)*g(t) = \int f(\tau)g(t-\tau)\text d\tau\\ x(n)*h(n) = \sum x(i)h(n-i) f(t)∗g(t)=∫f(τ)g(t−τ)dτx(n)∗h(n)=∑x(i)h(n−i)
convolve1d函数
scipy的ndimage模块提供了convolve1d函数,顾名思义用于1维卷积计算,其输入参数如下
python
scipy.ndimage.convolve1d(input, weights, axis=-1, output=None, mode='reflect', cval=0.0, origin=0)
其中,mode
用以调节卷积后边缘填充的数值,具体情况如下表所示,其中k即为cval参数。
左侧填充 | 数据 | 右侧填充 | |
---|---|---|---|
reflect | d , c , b , a d, c, b, a d,c,b,a | a , b , c , d a, b, c, d a,b,c,d | d , c , b , a d, c, b, a d,c,b,a |
constant | k , k , k , k k, k, k, k k,k,k,k | a , b , c , d a, b, c, d a,b,c,d | k , k , k , k k, k, k, k k,k,k,k |
nearest | a , a , a , a a, a, a, a a,a,a,a | a , b , c , d a, b, c, d a,b,c,d | d , d , d , d d, d, d, d d,d,d,d |
mirror | d , c , b d, c, b d,c,b | a , b , c , d a, b, c, d a,b,c,d | c , b , a c, b, a c,b,a |
wrap | a , b , c , d a, b, c, d a,b,c,d | a , b , c , d a, b, c, d a,b,c,d | a , b , c , d a, b, c, d a,b,c,d |
实战
下面实战演示一下不同模式的填充区别
python
import numpy as np
n = np.arange(20)/2
x = np.sin(n)
h = [-2, -1, 0, 1, 2]
plt.plot(x)
plt.plot(y, label=m, marker='.', color='r')
for m in ["reflect", "constant", "nearest", "mirror", "wrap",]:
y = sn.convolve1d(x, h, mode=m, cval=2)
plt.plot(y, label=m)
plt.legend()
plt.grid()
plt.show()
得到图像