为什么要滤波
- 增强特征
- 抑制噪声
有哪些噪声
-
椒盐噪声
也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。
-
高斯噪声
顾名思义是指服从高斯分布(正态分布)的一类噪声,通常是因为不良照明和高温引起的传感器噪声。通常在RGB图像中,显现比较明显。如下图
有哪些滤波方法
均值滤波
卷积核为
特点: 作用:平滑图像, 可以把锐度降低;模糊图像,降低噪声;算法简单,计算速度快,效果较差。
高斯滤波
卷积核为
假定σ=1.5,则模糊半径为1的高斯模板就算如下
这个时候我们我们还要确保这九个点加起来为1(这个是高斯模板的特性),这9个点的权重总和等于0.4787147,因此上面9个值还要分别除以0.4787147,得到最终的高斯模板。
假设现有9个像素点,灰度值(0-255)的高斯滤波计算如下:
特点: 作用:相对于均值滤波它的平滑效果更柔和,而且边缘保留的也更好。
以 q 为中心的窗口中,某一点 p 在高斯滤波过程中的权重的计算方法如下式;
中值滤波
特点: 中值滤波法是一种非线性平滑技术,它将每一像素点的像素值设置为该点某邻域窗口内的所有像素点像素值的中值。统计排序滤波器,中值对椒盐噪声(有最大小值特性)有很好的抑制作用,效果是图像中瑕疵更光滑。(没用卷积)
双边滤波
高斯滤波的在滤波窗口内,距离中心点越近的点的权重越大;这种只关注距离的思想在某些情况下是可行的,例如在平坦的区域,距离越近的区域其像素分布也越相近,自然地,这些点的像素值对滤波中心点的像素值更有参考价值。但是在像素值出现跃变的边缘区域,这种方法会适得其反,损失掉有用的边缘信息。此时就出现了一类算法——边缘保护滤波方法,双边滤波就是最常用的边缘保护滤波方法(另一种常用来与双边滤波对比的边缘保护滤波方法——引导滤波)。
双边滤波的思想很简单,在高斯滤波的基础上加入了像素值权重项,也就是说既要考虑距离因素,也要考虑像素值差异的影响,像素值越相近,权重越大。将像素值权重表示为
G
r
G_r
Gr,空间距离权重表示为
G
s
G_s
Gs
那么整个滤波器可以表示为
B
F
BF
BF,那么滤波结果为;
在平坦区域,滤波器中每个像素点的
G
r
G_r
Gr 值相近,空间距离权重
G
s
G_s
Gs 主导滤波效果。在边缘区域,边缘同侧的
G
r
G_r
Gr值相近,且远大于边缘另一侧的
G
s
G_s
Gs 值,此时另一侧的像素点的权重对滤波结果几乎不影响,边缘信息得到保护。表现出了一定的自适应性。
在平坦区域出现噪声点时,噪声点周围的信号的权值都很小,在进行归一化后,这些权值得到了提升,因此对噪声点也有滤除效果。
OpenCV中滤波方法对应的API
均值滤波
blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1,-1), int borderType );
// 原图像,目标图像,窗口大小x y坐标,中心坐标默认(-1,-1),borderType边界处理类型默认
blur(src, dst, Size(3, 3), Point(-1, -1)); //均值滤波,窗口大小,中心点,borderType默认为4不用管
高斯滤波
GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmaX, sigmaY, int borderType);
// 原图像,目标图像,高斯窗口大小x y坐标, σx σy正态分布情况
GaussianBlur(src, dst2, Size(11, 11), 11, 11); //高斯模糊,高斯窗口大小x y坐标,σx σy正态分布情况
中值模糊
medianBlur( Mat src, Mat dest, ksize );
- ksize - 窗口大小ksize * ksize, ksize必须是大于1而且必须是奇数。(因为偶数不容易找中心像素,高斯也要中心化等)
双边模糊
bilateralFilter(src, dest, d=15, 150, 3);
- 15 –计算的半径,半径之内的像数都会被纳入计算,如果提供-1 则根据sigma space参数取值
- 150 – sigma color像素差值,决定多少差值之内的像素会被计算,值域
- 3 – sigma space空间大小,如果d的值大于0则此声明无效,否则根据它来计算d值
滤波效果
椒盐噪声原图
中值滤波后效果
高斯噪声原图
滤波后