10-模糊处理2
掌握
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;
}