我们这一讲主要讲比较常用的图像滤波器(均值滤波,高斯滤波,中值滤波)。
图像滤波简介:
灰度值得高低代表信号的强弱
变化明显的地方,低通滤波可以让图像变得平滑,消除噪声干扰
线性滤波:方框滤波、均值滤波、高斯滤波
非线性滤波:中值滤波、双边滤波
滤波的原理:
线性滤波器输出像素g(i,j)是输入像素f(i+k,j+I)的加权和,其中h(k,l)我们称之为
核,是滤波器的加权系数,上面式子简写为:
1)均值滤波---blur()
均值滤波即方框滤波归一化特例,就是用邻域内像素均值来代替该点像素值,
均值滤波在去噪的同时也破坏了图像细节部分
函数原型:
ksize: Size类型表示内核大小,一般用Size(w,h)表示内核大小,Size(3,3)表示3x3的核大小
anchor:表示锚点(即被平滑的那个点),默认值Point(-1,-1),表示锚点在核中心
borderType:图像像素边界模式,一般用默认值
即可
2)高斯滤波---blurGaussianBlur()
高斯滤波器被称为最有用的滤波器,每个像素点都是由本身和邻域内的其他像素值经过加权平均后得到的,
加权系数越靠近中心越大,越远离中心越小,能够很好的滤除噪声。
函数原型:
ksize:高斯内核大小,一般用Size(w,h)表示内核大小,w, h可以不同,但是必须为正奇数或者0,由sigma计算得来
sigmaX:表示高斯函数在X方向上的标准偏差
sigmaY:表示高斯函数在Y方向上的标准偏差,若
sigmaY =0, 就将它设置为 sigmaX ;若sigmaY=0&& sigmaX=0则由ksize.width和ksize.height计算出来
3)中值滤波---medianBlur()
中值滤波是一种非线性滤波,是用像素点邻域灰度值的中值代替该点的灰度值,可以去除脉冲噪声和椒盐噪声
median({1,2,3,3,7,5,1,8})=3 排序后的中间那个值
函数原型:
4)双边滤波---bilateralFilter()
双边滤波是一种非线性滤波,是结合图像空间邻近度和像素值相似度的一种折中处理,尽量在去噪同时保存边缘
函数原型:
d:表示过滤过程中每个像素的邻域直径
sigmaColor:颜色空间滤波器sigma值,值越大表面该像素邻域内有越广泛的颜色会混到一起,产生较大的半相等颜色区域
sigmaSpace:坐标空间中滤波器的sigma值,坐标空间的标准方差
borderType:图像像素边界模式,一般用默认值即可
#include"opencv2/opencv.hpp"
using namespace cv;
void main()
{
Mat src = imread("a.jpg");
Mat dst1;
Mat dst2;
Mat dst3;
Mat dst4;
Size size0 = Size(3, 3);
blur(src,dst1,size0);//均值滤波
GaussianBlur(src,dst2,size0,1);//高斯滤波
medianBlur(src,dst3,5);//中值滤波
bilateralFilter(src,dst4,5,10.0,2.0);//双边滤波
imshow("原图",src);
imshow("均值滤波",dst1);
imshow("高斯滤波", dst2);
imshow("中值滤波", dst3);
imshow("双边滤波", dst4);
waitKey(0);
}