理论
平滑(smoothing)或者模糊(blurring)是一个简单常用的图像处理操作。
平滑的作用很多,这里主要介绍如何利用平滑来降低噪音。
平滑操作需要应用滤波。应用最广的滤波类型是线性滤波,其数学公式如下:
g
(
i
,
j
)
=
∑
k
,
l
f
(
i
+
k
,
j
+
l
)
h
(
k
,
l
)
g(i,j)=\sum\limits_{k,l}f(i+k,j+l)h(k,l)
g(i,j)=k,l∑f(i+k,j+l)h(k,l)
- g ( i , j ) g(i,j) g(i,j)为 i i i行 j j j列的像素值的滤波结果;
- h ( k , l ) h(k,l) h(k,l)为核,即一个系数矩阵,决定了对应 i i i行 j j j列的像素值的加权系数 k k k和 l l l;
- f ( i + k , j + l ) f(i+k,j+l) f(i+k,j+l)为 i i i行 j j j列的像素值的加权结果;
归一化方框滤波
这是所有滤波中最简单的一种。每个像素值的滤波结果都是它在核内的邻近像素值的平均值
归一化方框滤波的核如下:
K
=
1
K
w
i
d
t
h
∗
K
h
e
i
g
h
t
[
1
1
1
.
.
.
1
1
1
1
.
.
.
1
.
.
.
.
.
.
1
.
.
.
.
.
.
1
1
1
1
.
.
.
1
]
K=\frac{1}{K_{width}*K_{height}}\begin{bmatrix} 1 & 1 & 1 & ... & 1\\ 1 & 1 & 1 & ... & 1\\ . & . & . & ... & 1\\ . & . & . & ... & 1\\ 1 & 1 & 1 & ... & 1\\ \end{bmatrix}
K=Kwidth∗Kheight1
11..111..111..1...............11111
核中的所有系数均为1。
高斯滤波
高斯滤波是最有用的滤波。它用一个高斯分布的核对像素值进行卷积,然后把它们都相加。
一维的高斯核是个正态分布,标准正态分布图如下:
对于一维数据来说,落在中间的数将获得最大的权重,然后权重向两边递减。
二维高斯分布的公式如下:
G
0
(
x
,
y
)
=
A
e
−
(
x
−
μ
x
)
2
2
σ
x
2
−
(
y
−
μ
y
)
2
2
σ
y
2
G_0(x, y) = Ae^{\frac{-(x-\mu_x)^2}{2\sigma_x^2}\frac{-(y-\mu_y)^2}{2\sigma_y^2}}
G0(x,y)=Ae2σx2−(x−μx)22σy2−(y−μy)2
- μ \mu μ为平均数
- σ 2 \sigma^2 σ2分别为 x x x和 y y y的方差
中值滤波
中值滤波将图像中的每个像素点都用它邻近像素点的中值替代。
双边滤波
滤波在平滑图片的同时也会模糊图片的边缘。双边滤波能够防止边缘被模糊化。
相比于高斯滤波,双边滤波除了有权重,还有一个表示邻近像素点与目标像素点之间的强度差的成分。
更详细的说明,请参考该论文。
代码实现
在OpenCV中,以上集中滤波分别用以下函数实现:
归一化滤波
blur(src, //原始图片
dst, //目标图片
Size(i, i), //核的尺寸,宽-高
Point(-1, -1)); //锚点,即目标点,(-1, -1)则代表核的中心
高斯滤波
GaussianBlur(src, //原始图片
dst, //目标图片
Size(i, i), //核的尺寸,必须都是正奇数
0, //x的标准差,0代表根据核的尺寸计算x的标准差
0); //y的标准差,0代表根据核的尺寸计算y的标准差
中值滤波
medianBlur(src, //原始图片
dst, //目标图片
i); //核的尺寸,所以核的宽和高必须相等
双边滤波
bilateralFilter(src, //原始图片
dst, //目标图片
i, //核的尺寸,所以核的宽高必须相等
i*2, //颜色的标准差
i/2); //坐标的标准差