opencv几种常见滤波器使用方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OpenCv中几种常见的滤波器
一. 滤波器的作用
1.问题:数字图像信号的频率分布?
回答:信号或者图像的能量大部分在中低频段,少部分有用信号在高频段被噪声淹没(噪声都是高频信号)。因此设计滤波器能降低高频成分幅度就能减弱噪声影响。
2.问题:为什么要进行图像滤波?
回答:1.适应图像处理要求,消除图像数字化时所混入的噪声。
2.提取对象的特征作为图像识别的特征模式(没遇到过!)
3.问题:如何理解滤波器?
回答:把滤波器想象成一个包含加权系数的窗口,当使用滤波器平滑处理图像时,相当于把窗口放到图像上,透过窗口看图像。
4.问题:滤波器实现的结果是怎么样的?
回答:对图像做平滑或滤波后图像变得更模糊。
二.滤波器分类
2.1线性滤波器
1.低通滤波器:允许低频率通过
2.高通滤波器:允许高频率通过
3.带通滤波器:允许一定范围频率通过
4.带阻滤波器:阻止一定范围频率通过
5.全通滤波器:允许所有频率通过,只是改变相位
2.1.1 Opencv中提供的线性滤波函数
1.方框滤波:boxFilter函数
函数原型:void boxFilter (InputArray src,OutputArray dst,int ddepth,Size
ksize,Pointanchor=Point(-1,-1),boolnormalize=true,int borderType=BORDER_DEFAULT)
参数说明:InputArray,输入图像src。
OutputArray ,输出图像dst。
Int类型ddepth,输出图像深度,-1代表使用原图src 深度。
Size类型ksize,内核大小,一般用Size(w,h),w为宽度,h为深度。
Point类型anchor,被平滑的点,表示取内核中心,默认值Point(-1,-1)。
Bool类型normalize,标识符,表示内核是否被归一化。默认值为true。
Int类型boderType,推断图像外部像素的某种边界模式。默认值BORDER_DEFAULT。
2.均值滤波:blur函数
函数原型:void blur(InputArray src,OutputArray dst,int ddepth,Size ksize,Pointanchor=Point(-1,-1), int borderType=BORDER_DEFAULT)
参数说明:InputArray,输入图像src。
OutputArray ,输出图像dst。
Int类型ddepth,输出图像深度,-1代表使用原图src 深度。
Size类型ksize,内核大小,一般用Size(w,h),w为宽度,h为深度。
Point类型anchor,被平滑的点,表示取内核中心,默认值Point(-1,-1)。
Int类型boderType,推断图像外部像素的某种边界模式。默认值BORDER_DEFAULT。
3.高斯滤波:GaussianBlur函数
函数原型:void GaussianBlur(InputArray src,OutputArray dst, Size ksize,double sigmaX,double sigmaY=0,
int borderType=BORDER_DEFAULT)
参数说明:InputArray,输入图像src。
OutputArray ,输出图像dst.
Size类型ksize,内核大小,一般用Size(w,h),w为宽度,h为深度。
double类型的sigmaX,表示高斯核函数在X方向上的标准偏差。
Double类型的sigmaY,表示高斯核函数在Y方向上的标准偏差,sigmaY有默认值为0.如果sigmaX和sigmaY都为0,由内核的宽高计算出来。
Int类型boderType,推断图像外部像素的某种边界模式。默认值BORDER_DEFAULT。
4.补充:boxblur函数中的参数normalize,当normalize=true时为均值滤波。言外之意,均值滤波是方框滤波归一化后的特殊情况。
2.1.2 线性滤波器的计算方法
图注:邻域滤波(卷积):左边图像与中间图像的卷积产生右边图像。目标图像中蓝色标记的像素是利用原图像中红色标记的像素计算得到的。
线性滤波处理的输出像素值是输入像素值
的加权和:
其中的加权和为,我们称其为“核”,滤波器的加权系数,即滤波器的“滤波系数”。
上面的式子可以简单写作:
其中f表示输入像素值,h表示加权系数“核“,g表示输
出像素值。
举例说明:
对待处理的当前像素,选择一个内核大小,该内核为其邻近的若干个像素组成,用内核的均值来替代原像素的值的方法。
取出图像中的几个像素点,并标注需要处理的像素点F(X,Y)
123
4F(X,Y)5
678
图注:1~8为(x,y)的邻近像素
设置内核大小
通过均值滤波器后其计算为:
F(X,Y)=
(f(x-1,y-1) + f(x,y-1)+ f(x+1,y-1) + f(x-1,y) + f(x,y) + f(x+1,y) + f(x-1,y+1) + f(x,y+1) + f(x+1,y+1))/9
设置内核大小
通过方框滤波器后其计算为:
F(X,Y)=
f(x-1,y-1) + f(x,y-1)+ f(x+1,y-1) + f(x-1,y) + f(x,y) + f(x+1,y) + f (x-1,y+1) + f(x,y+1) + f(x+1,y+1)
通过高斯滤波器利用公式:
代入x,y 值可以算出F(X,Y)的值。
2.2 非线性滤波器
1.中值滤波:像素点邻域灰度值的中值代替该像素点的灰度值。
2.双边滤波:基于空间分布的高斯滤波函数,比高斯滤波多一个sigma-d的高斯方差。
2.2.1 Opencv中提供的非线性滤波函数
1.中值滤波:medianBlur函数
函数原型:void medianBlur(InputArray src,OutputArray dst,int ksize)
参数说明:InputArray,输入图像src。
OutputArray ,输出图像dst.
int类型ksize,孔径的线性尺寸,这个参数必须是大于1的奇数
2.双边滤波:bilateralFilter(InputArray src,OutputArray dst, int
d, double sigmaColor,double sigmaSpace,
int borderType=BORDER_DEFAULT)