线性滤波: 方框滤波、均值滤波、高斯滤波
非线性滤波: 中值滤波、双边滤波图像
不能损害图像的轮廓和边缘,
图像清晰视觉效果更好
(1)方框滤波
它是滤波器中最简单的,是通过滤波器核K内每个像素值的平均值得到的,滤波核如下
参数:
InputArray src: 输入图像,可以是Mat类型
. OutputArray dst: 经滤波后输出图像
. int ddepth: 目标图像的深度,若设置为-1,则深度与原图像深度相同
. Size ksize: Size类型,内核的大小,一般用Size(w, h)表示,如Size(3, 3)表示kernel窗口大小为3x3
. Point anchor = Point(-1,-1): 进行滤波操作的点,如果是默认值(-1, -1)说明对上述窗口中心点所对应的像素点进行操作
. bool normalize = true: 内核是否被归一化处理,有默认值true
. int borderType = BORDER_DEFAULT: 用于腿短图像外部像素的某种便捷模式,有默认值BORDER_DEFAULT.
(2)均值滤波
就是归一化后的方框滤波,对于方框滤波,若normalize=true,则方框滤波变为均值滤波(所有像素的加权系数相等),归一化就是将要处理的量缩放到一定范围,比如(0,1)。
(3)高斯滤波
高斯滤波可以很好的消除噪声,高斯模糊对图像来说就是一个低通滤波器;数学角度来讲,就是图像与正态分布做卷积;其就是每个像素点本身和邻域内的其他的像素值加权平均;它是图像平滑的重要方式,能有效抑制噪声,达到图像平滑的效果;平均模板对四周像素的使用是一视同仁的,这样的话整幅图处理后看上去就会非常的模糊;然而高斯滤波打破了这样的局限,分配以不同的权重,随着距离中心距离的增大,权重将迅速减小,从而确保中心的像素点看起来更像是接近与它更近的像素点,这样图像的连续性得到了保证!
参考:https://blog.csdn.net/zhangfuliang123/article/details/76100973
(4) 中值滤波
中值滤波方法是,对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,对模板的像素由小到大进行排序,再用模板的中值来替代原像素的值的方法。其思想是用像素点邻域灰度值的中值代替该像素的灰度值,有利于去除脉冲噪声及椒盐噪声,中值滤波花费时间比均值滤波久,噪声消除能力更强,不利于去除高斯噪声
(5)双边滤波
双边滤波是一种可以保边去噪的滤波器,与高斯滤波器相比,对于图像的边缘信息能过更好的保存。其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高斯函数相乘,优化后的权系数再与图像信息作卷积运算,这样就能在滤波的同时考虑到图像信息中的图像边缘信息,使图像在正常Gauss滤波后很模糊的边缘信息得以保持清晰,并且图像边缘更加平滑,次方法对于彩色和灰度图像的滤波均适用,很强的实用性。
https://blog.csdn.net/Jfuck/article/details/8932978
空间距离:指的是当前点与中心点的欧式距离。空间域高斯函数其数学形式为,其中(xi,yi)为当前点位置,(xc,yc)为中心点的位置,sigma为空间域标准差:
灰度距离:指的是当前点灰度与中心点灰度的差的绝对值。值域高斯函数其数学形式为,其中gray(xi,yi)为当前点灰度值,gray(xc,yc)为中心点灰度值,sigma为值域标准差:
双边滤波器的加权系数是这两部分因子的非线性组合,空间邻近度因子Ws和亮度相似度因子Wr的乘积。前者随着像素点与中心点之间欧几里德距离的增加而减小,后者随着两像素亮度值之差的增大而减小。在图像变化平缓的区域,邻域内像素亮度值相差不大,双边滤波转化为高斯低通滤波器;在图像变化剧烈的区域,滤波器利用边缘点附近亮度值相近的像素点的亮度值平均代替原亮度值。因此,双边滤波器既平滑滤波了图像,又保持了图像的边缘。双边滤波器受3个参数的控制:滤波器半宽N、参数δs和δr。N越大,平滑作用越强;δs和δr分别控制着空间邻近度因子Ws和亮度像似度因子Wr的衰减程度。
https://www.cnblogs.com/walccott/p/4957108.html
方框滤波
void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), bool normalize=true, int borderType=BORDER_DEFAULT )
均值滤波
void blur(Input 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)
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat srcImage, dstImage;
srcImage = imread("D://image//lena.png");
//判断图像是否加载成功
if (srcImage.empty())
{
cout << "图像加载失败!" << endl;
return -1;
}
else
cout << "图像加载成功!" << endl << endl;
namedWindow("原图像", WINDOW_AUTOSIZE);
imshow("原图像", srcImage); //显示原图像
//boxFilter(srcImage, dstImage, -1, Size(3, 3), Point(-1, -1), false); //方框滤波未归一化
//boxFilter(srcImage, dstImage, -1, Size(3, 3)); //方框滤波归一化
//blur(srcImage, dstImage, Size(3,3)); //均值滤波
//GaussianBlur(srcImage, dstImage, Size(3,3), 5, 0);//高斯滤波
//medianBlur(srcImage, dstImage, 3); //中值滤波
bilateralFilter(srcImage, dstImage, 3, 11 * 2, 11 / 2);
imshow("双边k3", dstImage);
bilateralFilter(srcImage, dstImage, 7, 11 * 2, 25 / 2);
imshow("双边k7", dstImage);
bilateralFilter(srcImage, dstImage, 11, 11 * 2, 25 / 2);
imshow("双边k11", dstImage);
imshow("方框滤波", dstImage);
waitKey(0);
return 0;
}
下图为方框滤波没有归一化的结果
下图为归一化后的方框滤波结果,可发现其与均值滤波相同
均值滤波
高斯滤波 c格码:0.2
高斯滤波 c格码:5
中值滤波
原图--------------滤波窗口3---------------滤波窗口7-------------------------滤波窗口11
双边滤波
参考:https://blog.csdn.net/KYJL888/article/details/78319139