本文主要涉及到五种滤波方法,包括三种线性滤波器和两种非线性滤波器。
1. 线性滤波器
- 方框滤波
- 均值滤波
- 高斯滤波
2. 非线性滤波器
- 中值滤波
- 双边滤波器
图像滤波可以表示为如下的公式:
g(x,y)=∑k,lf(x+k,y+l)g(k,l)
其中 g(k,l) 称为核,通过构造核可以实现线性滤波方法
方框滤波器的核为:
opencv中只需要一个函数即可使用方框滤波:
void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )
其中Size表示核的大小,anchor默认为核中心点为滤波点,当boolnormalize为true时其实就是均值滤波,bordertype默认就可以了。
如上所述, α 为1时即是均值滤波,opencv中的均值滤波函数为:
void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
其内部其实调用的是方框滤波的函数,只是把boolnormalize设置为ture。
高斯滤波是比较常用的图像滤波方法,高斯滤波器也是一种线性滤波器,可以理解为图像与一个服从高斯分布的核进行卷积,核内像素的灰度加权平均值作为当前图像点的灰度值。高斯模糊是一种低通滤波器,通常采用二维零均值高斯滤波器对图像进行滤波。
opencv中的高斯滤波函数如下:
void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT )
sigmaX和sigmaY分别表示X和Y方向的标准差。
非线性滤波器不具有线性可加性,主要介绍opencv中的两种滤波方式。
中值滤波,顾名思义就是用模板内的中值代替模板的中心点位置的像素。中值滤波一般处理图像的随机噪声比较有效。
opencv中中值滤波函数为:
void medianBlur(InputArray src,OutputArray dst, int ksize)
双边滤波器也是一种非线性滤波器,同时考虑了空间域信息和灰度相似性。双边滤波器相比高斯滤波能够更好的保留高频信息,即对图像的边缘等细节保存较好。双边滤波从某种程度上看具有美颜的功能。
opencv中双边滤波函数为:
void bilateralFilter(InputArray src, OutputArraydst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)
还需要再介绍一下Opencv中的一个函数:
void filter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT )
filter2D函数可以很方便的实现自己的线性滤波器,其功能就是用图像与核做卷积运算。可以根据实际需求对核进行构造,非常方便,通过这个函数其实也可以实现上述的线性滤波方法。
参考:
http://blog.csdn.net/poem_qianmo/article/details/23184547