目录
- 一. 均值滤波
- 二. 中值滤波
- 三. 高斯滤波
假设,现在有输入:
一. 均值滤波
代码如下:
import cv2
import numpy as np
x = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=np.float32)
x_mean = cv2.blur(x, (3, 3))
print(x)
print('------------------------')
print(x_mean)
输出结果:
计算过程:
(1)边界填充:
均值滤波默认的边界填充方式为:BORDER_DEFAULT,
即BORDER_REFLECT_101,以一种对称的方式对边界进行填充
填充结果如下图所示:
对于上下边界,以[1,2,3]和[7,8,9]为对称轴,把[4,5,6]填充到上下边界,如下图所示:
同理,对于左右边界,以纵轴为对称轴,进行填充,如下图所示:
(2)根据滤波器的大小k,取区域内k*k个数字,取均值。以第1个位置为例:
如图所示,取5,4,5,2,1,2,5,4,5一共9个数字,计算均值为: (5+4+5+2+1+2+5+4+5)/9 = 3.666。
跟程序计算的结果一致,同理可求得其他位置的值。
二. 中值滤波
代码如下:
import cv2
import numpy as np
x = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=np.float32)
x_median = cv2.medianBlur(x, 3)
print(x)
print('------------------------')
print(x_median)
输出结果:
计算过程:
(1)对边界进行填充:
中值滤波的边界填充方式为: BORDER_REPLICATE,即复制相邻的值作为边界的值,如上图所示。
(2)根据滤波器大小k,选取区域内的k*k个数字,排序选取中值。以第一个位置1为例:
选取数字1, 1, 1, 1, 2, 2, 4, 4, 5,可以看到中值为2,所以滤波后第1个位置的值为2。
同理,求得其他位置的值。
三. 高斯滤波
代码如下:
import cv2
import numpy as np
x = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=np.float32)
x_gaussian = cv2.GaussianBlur(x, (3, 3), 1)
print(x)
print('------------------------')
print(x_gaussian)
输出结果:
计算过程:
(1)边界填充
高斯滤波默认的边界填充方式和均值滤波的方式一样,也是BORDER_REFLECT_101,因此填充完毕后,如下所示:
(2)高斯滤波
- 正态分布,也叫“高斯分布”,曲线如下所示:
- 一维正态分布公式如下所示,其中μ为x的均值,σ表示标准差。
- 图像一般都是二维的,二维正态分布的公式如下所示,假设均值μ为0,(x,y)表示坐标:
- 它的三维图像如下图所示:
- 我们可以总结出一个规律:对称,中间大,两边小。
- 高斯滤波器的值 (注意:这里设置μ=0,σ=1 )
滤波器大小为3*3,以中心为圆点坐标(0,0),其他位置的作为如下所示: - 将坐标值代入上面的公式,可得到每个位置的值:
- 再对上面的滤波器进行“归一化”,就是每个位置的值除以各个位置的总和,得到最终的高斯滤波器为:
- 可以看到,高斯滤波器符合“对称,中间大,两边小”的规律
(3)计算
将最终得到的滤波器在填充完边界的输入上滑动,作点乘操作,得到各个位置的值。以第一个位置为例: - 0.07511358 x 5 + 0.07511358 x 5 + 0.07511358 x 5 + 0.07511358 x 5 + 0.12384135 x 4 + 0.12384135 x 4 + 0.12384135 x 2 + 0.12384135 x 2 + 0.20417997 x 1 = 3.19254777,
跟程序计算出来的一致,同理,可得其他位置的值。