1.滤波器的作用
滤波,也称平滑或者模糊,主要是为了减小图像噪声和伪影,同时在降低图像分辨率的时候,平滑也是必要的。
2.认识两种噪声
首先我们来认识两种常见噪声:
椒盐噪声,也就是夹杂在图像中的黑色和白色噪音像素,这是一种非线性噪声,也称为乘性噪声,之所以称为乘性是因为这种噪声和源图像是伴随存在的,图像产生该噪声也就产生,图像消失该图像也就消失,这是一种非线性噪声,可以将图片看做一个系统 ,而椒盐噪声就是因为图片的时变性和非线性造成的。
高斯噪声,一种噪声强度满足正态分布的图像噪声,这是一种线性噪声,也称为加性噪声,它和图像是相加的关系,没有图像高斯噪声也存在,这种噪声不因为原图像的变化而变化,对于图片这个系统是时不变的,也称为线性的。
其它的诸如泊松噪声,就是满足泊松分布的噪声。
一般的我们使用不同滤波器用于对不同噪声处理,均值滤波,方框滤波,高斯滤波,双边滤波一般用于处理线性噪声,也就是高斯噪声,而非线性噪声我们一般使用中值滤波器。
3.方框滤波器和均值滤波器
我们把这两种滤波器放在一起学习是因为,均值滤波是方框滤波的特殊形式,两者的区别在于方框滤波器可以选择是否进行归一化,而均值滤波器则一定归一化,我们用图片来展示什么是归一化
当这个normalize属性为TRUE时,方框滤波和均值滤波相同,滤波器K*1/25归一化处理。而normalize属性为FALSE时,方框滤波器不进行归一化,也就是对高斯核直接求和作为中心像素点的灰度,这样子做很容易发生溢出,超出255范围。
OpenCV提供了现成的方框滤波函数去操作normalize属性
void boxfilter(
InputArray src, //输入图像
OutputArray dst, //输出图像
int ddepth, //输出图像深度也就是数据类型
Size k size, //滤波器大小,必须为奇数
Point anchor, //设置锚点,对齐方式一般中心对齐给(-1,-1)
bool normalize //是否归一化
);
我们再来看一看均值滤波器有什么不同
void blur(
InputArray src, //输入图像
OutputArray dst, //输出图像
Size ksize, //盒状核大小
Point anchor, //一般取(-1,-1),中心像素对齐
int borderType //边缘平滑类型传入参数BORDER_DEFAULT
);
均值滤波器无法指定输出图像的数据类型。多了边缘平滑,其它和方框滤波一样。
4.中值滤波器
中值滤波就是将盒状盒中的像素按照顺序排列,取中间像素作为结果,这种滤波器相较于线性滤波器有一个较大的好处是不受极端点的影响,比如椒盐噪声非黑即白,而线性滤波器需要对盒状核中每个像素加权求和,受偏差较大的点影响较大。
来看看中值滤波器长什么样
中值滤波函数
void midianBlur(
InputArray src, //输入图像
OutputArray dst, //输出图像
Size ksize //核大小
);
5.高斯滤波器
高斯噪声作为最常见的噪声,我们一般使用高斯滤波器进行滤波,可以有效去除高斯噪声
高斯公式:左边为一维高斯公式 右边为二纬高斯公式
我们在用高斯公式获得权重一般用的是一纬的高斯公式,同时获得两个高斯核,分别进行卷积运算,(x,y)对应的是高斯核各个像素的到中心像素的x,y坐标,分别带入一维高斯公式,中心像素为(0,0),反应的是方差,越大越接近均值滤波,越小中心像素加权越大。
高斯滤波器函数
void GaussianBlur(
InputArray src, //输入图像
OutputArray dst, //输出图像
Size ksize, //高斯核大小
double sigmaX, //沿X轴方差
double sigmaY, //沿Y轴方差
int borderType //边缘平滑方式
)
常见高斯核大小有5*3、3*3、5*5、7*7
对于X轴和Y轴上的取值,只给了x的值,y为0,那么y和x将相同,如果都设置为0,那么将使用以下公式获得方差
sigma X= 0.3*((ksize.width-1)*0.5-1)+0.8
sigma Y = 0.3*((ksize.height-1)*0.5-1)+0.8
高斯滤波器的边缘平滑参数一般传入RORDER_DEFAULT,默认平滑方式。
6.双边滤波
双边滤波是对高斯滤波的改进,由于高斯滤波是对一个一个矩形内所有元素加权求和,所以会淡化边界损失特征值,因此引入双边滤波来保证边界受影响较小。
我们先来看双边滤波器函数
void bilateralFilter(
InputArray src, //输入图像
OutputArray dst, //输出图像
int d, //像素临域的直径
double sigmacolor, //颜色空间滤波器的sigma值
double sigmaSpace, //坐标空间滤波器中的sigma值
int borderType //边缘平滑类型BORDER_DEFAULT
);
这个函数中参数d的作用和高斯滤波器中Size的作用类似 ,也可以直接给d=-1,函数将自动计算sigmaSpace的值,sigmaColor越大图像的边界感越强,sigmaSpace越大图像边界敢越弱,同时图像越模糊。