掌握

1、中值滤波(基于统计的滤波);
2、双边滤波(高斯双边滤波);
3、代码演示;
(均值滤波,高斯滤波)

中值滤波

1、中值滤波是统计排序滤波器;(基于像素统计学)
2、中值滤波对椒盐噪声(极大值极小值出现较为频繁)有很好的抑制作用;
椒盐噪声:(幅值基本相同,但出现位置随机的噪声)
从左到右,从上到下进行中值滤波,可以有效的去除椒盐噪声;
最小值滤波:取窗口内的排序最小的像素值作为有效像素值;最大值滤波同理取最大;(与膨胀腐蚀有关)

双边滤波

1、高斯函数:中心对称分布
2、均值滤波(均值模糊)无法克服边缘像素信息丢失,因为均值滤波是基于平均权重
3、高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同
4、高斯双边模糊–是边缘保留的滤波方法(对于像素值设有阈值,对于超过或小于阈值的不进行处理),避免了边缘信息丢失,保留了图像轮廓不变;
双边滤波需要确定传入的空域核与值域核的大小
空域核:考虑空间位置的卷积算子(窗口),即sigama的值,高斯函数的形状(是否抖);
值域核:考虑像素值不同设定的阈值,在规定范围内进行图像处理;
输出 = 输入 X (空域核 + 值域核);

API函数

1、中值模糊:meidianBlur(Mat src , Mat dst , ksize);
注:ksize大小必须大于1,而且是奇数;
2、双边模糊:bilateralFilter(src, dst, d = 15, 150,3);
参数值含义如下图:

Demo

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
   
	Mat src = imread("C:\\Users\\hello\\Desktop\\8.jpg");
	

	if (!src.data)
	{
   
		cout << "could not load the image..." << endl;
		return -1;
	}
	
	//美颜算法(部分模糊)--双边滤波,边缘保留的滤波算法
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

	//中值滤波 白点---椒盐噪声
	Mat mb;
	medianBlur(src, mb, 7);
	namedWindow("median filter", CV_WINDOW_AUTOSIZE);
	imshow("median filter", mb);

	//双边滤波 模糊图像,对轮廓
	Mat bf;
	bilateralFilter(src, bf, 15, 200, 3);
	namedWindow("bilateral filter", CV_WINDOW_AUTOSIZE);
	imshow("bilateral filter", bf);
	
	//高斯滤波
	Mat gblur;
	GaussianBlur(src, gblur, Size(15, 15), 3, 3);
	namedWindow("gaussian filter", CV_WINDOW_AUTOSIZE);
	imshow("gaussian filter", gblur);

	//使用矩阵掩膜操作滤波
	Mat mask;
	Mat kernel = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); //模板类创建掩膜
	filter2D(src, mask, -1, kernel, Point(-1, -1),0);
	namedWindow("mask filter", CV_WINDOW_AUTOSIZE);
	imshow("mask filter", mask);

	waitKey(0);
	return 0;
}

效果图