图像滤波的目的:
一是抽出对象的特征作为图像识别的特征模式;
二是为适应图像处理的要求,消除图像数字化时所混入的噪声。
滤波器的分类:
线性滤波:方框滤波、均值滤波和高斯滤波。
非线性滤波:中值滤波和双边滤波。
对于高斯滤波如果是低通就是模糊操作,如果是高通就是锐化操作。
方框滤波:
void cv::boxFilter | ( | InputArray | src, //输入图像 |
OutputArray | dst, //输出图像 | ||
int | ddepth, //输出图像深度,-1代表原图像深度 | ||
Size | ksize, // 核大小 | ||
Point | anchor = Point(-1,-1) , //锚点,(-1,-1)表示取核的中心为锚点 | ||
bool | normalize = true , // 表示内核是否被区域归一化 | ||
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("blurimg");
imshow("src", src);
//进行均值滤波
Mat blurimg;
boxFilter(src, blurimg, -1, Size(5, 5));
imshow("blurimg", blurimg);
waitKey(0);
return 0;
}
结果展示:
均值滤波:
输出图像的每一个像素是核窗口内输入图像对应像素的平均值。缺点是:会使图像变得模糊,不能很好地去除噪点。
void cv::blur | ( | InputArray | src, //输入图像 |
OutputArray | dst, //输出图像 | ||
Size | ksize, //核大小 | ||
Point | anchor = Point(-1,-1) , //锚点 | ||
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("blurimg");
imshow("src", src);
//进行均值滤波
Mat blurimg;
box(src, blurimg,Size(9, 9));
imshow("blurimg", blurimg);
waitKey(0);
return 0;
}
结果展示:
高斯滤波:
对整幅图像进行加权平均的过程,每一个像素点的值,都由本身和邻域内的其他像素值经过加权平均后得到。
具体操作流程:用一个模板(卷积或掩膜)扫描图像中的每一个像素,用模板确定的领域内像素的加权平均灰度值去替代模板中心像素点的值。
void cv::GaussianBlur | ( | InputArray | src, |
OutputArray | dst, | ||
Size | ksize, | ||
double | sigmaX, //x方向的标准偏差 | ||
double | sigmaY = 0 , //x方向的标准偏差 | ||
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("blurimg");
imshow("src", src);
//进行均值滤波
Mat blurimg;
GaussianBlur(src, blurimg,Size(5, 5),0,0);
imshow("blurimg", blurimg);
waitKey(0);
return 0;
}
结果展示: