Opencv学习——图像滤波

本文主要涉及到五种滤波方法,包括三种线性滤波器和两种非线性滤波器。
1. 线性滤波器
- 方框滤波
- 均值滤波
- 高斯滤波
2. 非线性滤波器
- 中值滤波
- 双边滤波器

线性滤波器

图像滤波可以表示为如下的公式:
g(x,y)=k,lf(x+k,y+l)g(k,l)
其中 g(k,l) 称为核,通过构造核可以实现线性滤波方法

方框滤波

方框滤波器的核为:

α111111111

其中:
α={ 1widthheight,normalize==true1,normalize==false

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

你可能感兴趣的:(opencv,opencv)