tastynoob
Articles58
Tags18
Categories7
简单的滤波算法

简单的滤波算法

简单的滤波算法

  • 卷积一维滤波
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import numpy as np
import math
import matplotlib.pyplot as plt


###############################
#一维滤波
###############################


start_X = -np.pi
end_x = np.pi
slice_num = 200 #切分
X = np.linspace(start_X,end_x,slice_num,endpoint=True) #X轴向
wave1 = 10*np.sin(X) + 5*np.append(np.random.rand(len(X)-100),np.zeros(100))
#使用复数代表波形,实部代表时间轴,虚部代表幅度
wave1 = X + wave1 * 1j

wave1_real=np.real(wave1)
wave1_imag=np.imag(wave1)
#将波形旋转90度
#wave1 = wave1 * 1j


plt.title('original data')
plt.plot(np.real(wave1), np.imag(wave1))
plt.show()



# 卷积滤波 使用复数
wave2 = []
filter1 = [0.2,0.3,0.5]
for i in range(len(wave1) - len(filter1) + 1):
point = 0
for j in range(len(filter1)):
point += wave1[i+j] * filter1[j]
wave2.append(point)
wave2 = np.array(wave2)

fig=plt.figure()
plt.title('Convolution filtering consider the time axis')
plt.plot(np.real(wave2), np.imag(wave2))
plt.show()




# 卷积滤波 不使用复数
wave2 = []
for i in range(len(wave1_imag) - len(filter1) + 1):
point = 0
for j in range(len(filter1)):
point += wave1_imag[i+j] * filter1[j]
wave2.append(point)
for j in range(len(filter1) - 1):
wave2.append(0)
wave2 = np.array(wave2)

fig=plt.figure()
plt.title('Convolution filtering does not consider the time axis')
plt.plot(np.real(wave1),wave2)
plt.show()




# 普通平滑滤波
#老数据加权和
wave2 = []
#注意此处的滤波器是老数据的各个加权和
filter2 = [0.4,0.4,0.5]
last = [0,0]#保存老数据
for i in range(len(wave1_imag)):
k=0
for j in range(len(filter2)-1):#先加权老数据
k += last[j] * filter2[j]
#再加权新数据
k += wave1_imag[i] * filter2[-1]
#删除最老的一个数据
del last[0]
#添加新数据
last.append(k)
wave2.append(last[-1])
wave2 = np.array(wave2)

fig=plt.figure()
plt.title('Ordinary smoothing filter')
plt.plot(X,wave2)
plt.show()

滤波效果:
图像

  • 多维滤波
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import numpy as np
import math
import matplotlib.pyplot as plt
import cv2

###############################
# 二维滤波
###############################

start_X = -np.pi
end_x = np.pi
slice_num = 200 # 切分
X = np.linspace(start_X, end_x, slice_num, endpoint=True) # X轴向
wave1 = 10*np.sin(X) + np.append(np.random.rand(len(X)-100), np.zeros(100))
wave1 = X + wave1 * 1j
wave1_real = np.real(wave1)
wave1_imag = np.imag(wave1)

wave2 = 10*np.sin(X) + np.append(np.random.rand(len(X)-100), np.zeros(100))
wave2 = X + wave2 * 1j
wave2_real = np.real(wave1)
wave2_imag = np.imag(wave1)


plt.title('original data1')
plt.plot(np.real(wave1), np.imag(wave1))
fig = plt.figure()
plt.title('original data2')
plt.plot(np.real(wave2), np.imag(wave2))
plt.show()


# 二维卷积滤波,常用于2个或多个传感器滤波减少误差
wave = [wave1, wave2]
wave3 = []
filter1 = [[0.5,0.5],
[0.5,0.5]]
for i in range(len(wave1) - len(filter1) + 1):
point = 0
for j in range(len(filter1)): # 2行
for k in range(len(filter1[0])): # 2列
point += filter1[j][k] * wave[j][i+k]
wave3.append(point)
wave3 = np.array(wave3)
fig = plt.figure()
plt.title('filter data')
plt.plot(np.real(wave3), np.imag(wave3))
plt.show()

# 二维图像滤波,这里是直接调opencv库
fig = plt.figure()
plt.title('original image')
img = plt.imread("0.jpg")
plt.imshow(img)

# 卷积核
kernel = np.array([ [1, -2, 1],
[1, -2, 1],
[1, -2, 1]])

res = cv2.filter2D(img, -1, kernel)
fig = plt.figure()
plt.title('filter image')
plt.imshow(res)

滤波效果:
图像

  • 傅里叶滤波
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import numpy as np
import math
import matplotlib.pyplot as plt


###############################
#离散傅里叶变换 时域转频域
###############################


start_X = -2*np.pi
end_x = 2*np.pi
slice_num = 200 #切分
X = np.linspace(start_X,end_x,slice_num,endpoint=True) #X轴向
#在原始波形的基础上添加噪点
wave1 = 10*np.sin(X) + 5*np.append(np.random.rand(len(X)-100),np.zeros(100))
wave1 = X + wave1 * 1j
wave1_real=np.real(wave1)
wave1_imag=np.imag(wave1)

# wave1 = wave1

plt.title('original data')
plt.plot(np.real(wave1), np.imag(wave1))
plt.show()


pi = 3.1415926
def DFT(origin): # 计算给定序列的离散傅里叶变换结果
N= len(origin)
output = []
for i in range(N):
temp = 0
for j in range(N):
temp += origin[j] * (
(math.cos(2 * math.pi * i * j / N) - math.sin(2 * math.pi * i * j / N) * 1j)
)
output.append(temp)
return output


def IDFT(origin): #逆变换
N= len(origin)
output = []
for i in range(N):
temp = 0
for j in range(N):
temp += origin[j] * (
(math.cos(2 * math.pi * i * j / N) + math.sin(2 * math.pi * i * j / N) * 1j)
)
output.append(temp / N)
return output

#dft输出 , 对波形1做傅里叶变换
dft_wave = DFT(wave1_imag)
#idft输出 逆变换
idft_wave = IDFT(dft_wave)

fig = plt.figure()
plt.title('DFT abs data')
plt.plot(np.real(wave1), np.abs(dft_wave))
plt.show()


fig = plt.figure()
plt.title('IDFT data')
plt.plot(np.real(wave1), np.real(idft_wave))
plt.show()

#傅里叶滤波
dft_new_wave = dft_wave.copy()
#过滤杂波,将频谱图上的杂波过滤
for i in range(len(dft_new_wave)):
if(dft_new_wave[i].__abs__() <= 200):
dft_new_wave[i]=0
#逆变换得到无杂波的波形
idft_wave = IDFT(dft_new_wave)


fig = plt.figure()
plt.title('DFT filter data')
plt.plot(np.real(wave1), np.real(idft_wave))
plt.show()


傅里叶滤波效果:
图像

Author:tastynoob
Link:https://tastynoob.github.io/1970/01/01/%E7%AE%97%E6%B3%95/%E6%BB%A4%E6%B3%A2/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×