在摄像头采集图像的过程中,由于环境因素或者摄像头的自身原因,会产生本身不需要的噪声,OpenCV中有几种方式用于滤波,处理部分图像噪声。
滤波的作用: 增强或去除某一部分有用的线条、轮廓等特征,便于后期对这一特征的提取。

平均滤波

线性滤波,取当前像素点的邻域几个像素点的平均值赋值给当前像素点。
缺点:不针对某些特定点、线,在去噪声的过程中,也会造成图像模糊。

void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor = Point(-1,-1),
                        int borderType = BORDER_DEFAULT );

第一个参数:输入的图像,Mat类型的对象;
第二个参数:输出的图像;
第三个参数:邻域求平均值的范围大小(核);
第四个参数:核锚点(取平均值被赋值的点),有默认值point(-1,-1),锚点是最中心那个点;
第五个参数:一般不管。

高斯滤波

去除高斯噪声(概率密度函数服从正态分布),图像中的噪声大部分为高斯噪声。适用于大部分图像处理的情况。
高斯滤波也是求取平均值的过程,只是每个值有其权重。

void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );

第一个参数:输入的图像,Mat类型的对象;
第二个参数:输出的图像;
第三个参数:邻域求平均值的范围大小(核);
第四个参数:x方向上的标准差;
第五个参数:y方向上的标准差,当x、y方向上的标准差都为0,由核的高度和宽度自动确定;
第六个参数:取边缘的类型,一般不管。

中值滤波

有效去除去除椒盐状的噪声。

void medianBlur( InputArray src, OutputArray dst, int ksize )

第一个参数:输入的图像,Mat类型的对象;
第二个参数:输出的图像;
第三个参数:正方形区域的边长;

双边滤波

双边滤波在某个差距范围中才进行滤波,超出范围的不滤波。保留图像的边缘特征,对于提取图像边缘很有效。

void bilateralFilter( InputArray src, OutputArray dst, int d,
                                   double sigmaColor, double sigmaSpace,
                                   int borderType = BORDER_DEFAULT );

第一个参数:输入的图像,Mat类型的对象;
第二个参数:输出的图像;
第三个参数:表示在过滤过程中每个像素邻域的直径。如果这个值我们设其为非正数,那么OpenCV会从第五个参数sigmaSpace来计算出它来,在使用过程中我发现有点像模糊力度的意思;
第四个参数:颜色空间滤波器的sigma值。这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域。在使用过程中我发现有点像模糊范围的意思,范围越大看着越模糊;
第五个参数:坐标空间中滤波器的sigma值,坐标空间的标注方差。他的数值越大,意味着越远的像素会相互影响,从而使更大的区域足够相似的颜色获取相同的颜色。当d>0,d指定了邻域大小且与sigmaSpace无关。否则,d正比于sigmaSpace。使用过程中我发现这个值越大,图像的过渡效果越好;
第六个参数:一般不管。