OpenCV图像处理(六)图像滤波(1)
2018-04-07 本文已影响0人
行走行囊
1、滤波的作用
图像滤波,是指尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,其处理的好坏直接影响到后续图像处理的有效性和可靠性。滤波操作也叫平滑处理,主要目的有两个:模糊图像和消除噪音。
2、滤波的方式
①均值滤波:最简单的一种滤波操作,输出图像的每一个像素是核窗口内输入图像对应像素的平均值(所有像素的加权系数相等)。
②高斯滤波:高斯滤波可以消除高斯噪声,其操作原理是用一个模板,该模板的加权系数通过高斯函数确定,再用这个模板对图像的每个像素进行卷积操作,得到滤波后的图像。
③中值滤波:其基本思想是用像素点领域灰度值的中值来代替该像素点的灰度值,可有效的去除椒盐噪声。
④双边滤波:双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值的相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。注意,双边滤波对处理彩色图像的椒盐噪声效果不明显。
3、滤波函数
// 均值滤波
void blur( InputArray src, OutputArray dst,
Size ksize, Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT );
// 高斯滤波
void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY = 0,
int borderType = BORDER_DEFAULT );
// 中值滤波
void medianBlur( InputArray src, OutputArray dst, int ksize );
// 双边滤波
void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
4、测试代码
// 添加椒盐噪声
void addSalt(Mat& image, int n)//本函数加入彩色盐噪声
{
srand((unsigned)time(NULL));
for (int k = 0; k<n; k++)//将图像中n个像素随机置零
{
int i = rand() % image.cols;
int j = rand() % image.rows;
//将图像颜色随机改变
image.at<Vec3b>(j, i)[0] = 250;
image.at<Vec3b>(j, i)[1] = 150;
image.at<Vec3b>(j, i)[2] = 250;
}
}
src.png
均值滤波
Mat src = imread("D:/hf.jpg");
Mat blur_img;
blur(src,blur_img,Size(5,5));
imshow("blur_img", blur_img);
blur_img.png
高斯滤波
Mat src = imread("D:/hf.jpg");
Mat gaussianBlur_img;
GaussianBlur(src, gaussianBlur_img,Size(5,5),0,0);
imshow("gaussianBlur_img", gaussianBlur_img);
gaussianBlur_img.png
中值滤波
Mat src = imread("D:/hf.jpg");
Mat mid_img;
addSalt(src, 1000);
medianBlur(src,mid_img,5);
imshow("mid_img", mid_img);
椒盐处理.png
mid_img.png
双边滤波
Mat src = imread("D:/hf.jpg");
Mat bilateralFilter_img;
bilateralFilter(src, bilateralFilter_img, 25, 25 * 2, 25 / 2);
imshow("bilateralFilter_img",bilateralFilter_img);