中值滤波:
用像素点邻域灰度值的中值来替代该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时会保留图像的边缘细节。中值滤波在处理连续图像窗函数时与线性滤波器的工作方式类似,但滤波过程不在是加权运算。
与均值滤波对比:
优点:均值滤波器中,由于噪声成分被放入平均计算中,所以输出受到了噪声的影响。但在中值滤波器中,由于噪声成分很难选上,所以几乎不会影响到输出。
缺点:中值滤波花费的时间是均值滤波的5倍以上。
具体步骤:
例如3*3的函数,计算点 [ i, j ] 为中心的函数窗像素中值。
第一步:按强度大小排列像素点;
第二步:选择排序像素集的中间值作为点 [ i, j ] 的新值
void cv::medianBlur | ( | InputArray | src, |
OutputArray | dst, | ||
int | ksize //奇数 | ||
) |
案例:
#include<iostream>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/core.hpp>
using namespace std;
using namespace cv;
int main()
{
//导入图像
Mat src = imread("C:/Users/Administrator/Desktop/3.png");
if (!src.data)
{
cout << "请检查图像是否存在..." << endl;
return -1;
}
namedWindow("src");
namedWindow("dst");
imshow("src", src);
//中值滤波
Mat dst;
medianBlur(src, dst, 7);
imshow("dst", dst);
waitKey(0);
return 0;
}
结果展示:
边滤波:
它是结合图像空间邻近度和像素值相似度的一种折中处理方式,同时考虑了空间域信息和灰度相似性,达到保留边缘去除噪点的目的。
在双边滤波中输出像素值取决于邻域像素值的加权值组合:
而加权系数w(i,j,k,l)取决于定义域核和值域核的乘积。
其中定义域核为:
值域核为:
二者相乘后,就会得到取决于数据的双边滤波权重函数
void cv::bilateralFilter | ( | InputArray | src, |
OutputArray | dst, | ||
int | d, //过滤中每个像素邻域的直径,若为非正数,从第五个参数开始计算 | ||
double | sigmaColor, //值越大,表明该像素邻域内有越宽泛的颜色被混合到一起。 | ||
double | sigmaSpace,//坐标空间的标准方差,值越大,越远的像素会互相影响 | ||
int | borderType = BORDER_DEFAULT | ||
) |
案例:
#include<iostream>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/core.hpp>
using namespace std;
using namespace cv;
int main()
{
//导入图像
Mat src = imread("C:/Users/Administrator/Desktop/3.png");
if (!src.data)
{
cout << "请检查图像是否存在..." << endl;
return -1;
}
namedWindow("src");
namedWindow("dst");
imshow("src", src);
//中值滤波
Mat dst;
bilateralFilter(src,dst,50,50*2,50/2);
imshow("dst", dst);
waitKey(0);
return 0;
}
结果展示: