上一两节讲的是线性滤波,即每个像素的输出值是一些输入像素的加权和,线性滤波器易于构造,并且易于从频率响应角度来进行分析。
然而, 在很多情况下,使用邻域的非线性滤波会得到更好的效果,比如噪声是
散粒噪声
而不是高斯噪声
, 用高斯滤波器对图像进行模糊时不会去除噪声,它们只是转换了更为柔软但仍然可见的散粒。( --> 中值滤波 show Time)
1. 中值滤波
它是一种典型的非线性滤波技术,原理
是用像素点邻域灰度值的中值来代替该像素点的灰度值。 该方法在去除脉冲噪声
、椒盐噪声
的同时又能保留图像的边缘细节
。
- 中值滤波与均值滤波比较
/*
优势:中值滤波几乎不受噪声影响,均值滤波会将噪声成分当做数据进行计算,输出会受到一定程度上的影响。所以中值滤波消除噪声能力更胜一筹。
劣势: 中值滤波花费的时间是均值滤波的5倍以上。
*/
2. 双边滤波
结合图像的空间邻域度
和像素值相似度
的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的(即,边缘保存较好),具有简单、非迭代、局部的特点。
- 双边滤波与高斯滤波
//前者比后者多一个高斯方差,双边滤波的加权系数(w(i,j,k,l))取决于定义域核和值域核的乘积,就会产生一个依赖于数据的双边滤波权重函数。
3. OpenCV中非线性滤波器相关函数
/*
medianBlur ## 中值滤波
bilateralFilter ## 双边滤波
*/
/*******************************************************************
* void bilateralFilter( InputArray src, OutputArray dst, int d,
* double sigmaColor, double sigmaSpace,
* int borderType = BORDER_DEFAULT );
*
* d: 滤波邻域直径
* sigmaColor: 颜色空间滤波器的sigma值
* sigmaSpace: 坐标空间的标注方差 它的数值越大, 意味着越远的像素会相互影响,
*
*******************************************************************/
Mat medImage, doubImage;
medianBlur(srcImage, medImage, 5); // ksize Must > 1 odd.(3, 5, 7)
imshow("medianBlur", medImage);
bilateralFilter(srcImage, doubImage, 25, 25*2, 25/2);
imshow("bilateralFilter", doubImage);
4. 实现结果
在上图中,从左到右,从上到下,依次为blur、boxFilter、GaussianBlur、medianBlur、bilateralFilter